값을 얻기 위해 객체를 반복해야하므로 for 루프와 약속에 문제가 있습니다.

VDog

라는 배열이 previewMessages있고 객체를 반복 messages하고 값을 가져와야합니다. 이러한 값 중 하나는 비동기 호출이 필요하며 previewMessages, 예를 들어 정렬을 위해 for 루프 다음에 변수 를 사용하려는 경우에는 물론 작동하지 않습니다 .

코드는 다음과 같습니다.

var displayMessages = function(messages) {
    let previewMessages = [];
    for (let messageID in messages) {
        let message = messages[messageID];
        let messageObj = {};

        Promise.resolve(getItemsById([message.context.itemID])).then(function(itemInfo) {
            messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
        });

        previewMessages.push(messageObj);
    }
}

promise.all메시지를 반복해야하고 제목을 가져 오려면 비동기 호출이 필요하기 때문에 할 수 없습니다 .

이것이 도움이된다면 위의 함수를 호출하는 첫 번째 함수가 있습니다.

var getUserMessages = function(id) {
    usersRef.child(`${id}/chats/`).on('value', function(snapshot) {
        displayMessages(snapshot.val());
    })
}
TJ 크라우 더

두 가지 대안 :

비동기 호출이 병렬로 실행될 수있는 경우 (100 개가 있더라도 상관 없음) 다음 사용할 있습니다 Promise.all.

let previewMessages = [];
let promises = [];

// Build the array of promises
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {};
    previewMessages.push(messageObj);

    messageObj.timeStamp = message.context.latestPost;
    messageObj.user = message.context.otherUsername;
    messageObj.picture = message.context.itemImageURL;
    promises.push(getItemsById([message.context.itemID]).then(itemInfo => {
        messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
    }));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
    // use previewMessages
});

그들이 경우 순서로, 다음을 수행하기 전에 각각 기다립니다

let previewMessages = [];
let promise = Promise.resolve();

// Loop through building up the `then` chain
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {};
    previewMessages.push(messageObj);

    // This one will wait for the next
    promise = promise.then(() => {
        messageObj.timeStamp = message.context.latestPost;
        messageObj.user = message.context.otherUsername;
        messageObj.picture = message.context.itemImageURL;
        return getItemsById([message.context.itemID]).then(itemInfo => {
            messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
        });
    });
}
// Wait for the last one to complete
promise.then(() => {
    // Use previewMessages
});

그러나 기다릴 필요가없는 값을 채우기 위해 리터럴을 사용할 것입니다.

비동기 :

let previewMessages = [];
let promises = [];

// Build the array of promises
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {
        timeStamp: message.context.latestPost,
        user: message.context.otherUsername,
        picture: message.context.itemImageURL
    };
    previewMessages.push(messageObj);

    promises.push(getItemsById([message.context.itemID]).then(itemInfo => {
        messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
    }));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
    // use previewMessages
});

동조:

let previewMessages = [];
let promise = Promise.resolve();

// Loop through building up the `then` chain
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {
        timeStamp: message.context.latestPost,
        user: message.context.otherUsername,
        picture: message.context.itemImageURL
    };
    previewMessages.push(messageObj);
    // This one will wait for the next
    promise = promise.then(() => {
        return getItemsById([message.context.itemID]).then(itemInfo => {
            messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
        });
    });
}
// Wait for the last one to complete
promise.then(() => {
    // Use previewMessages
});

간단하고 실행 가능한 한 쌍의 예제가 도움이 될 것입니다. 또한 "... 문제는 func2가 func1에서 반환 객체를 가져 간다는 것입니다 ..."라고 언급 했으므로이를 믹스에 추가해 보겠습니다.

평행:

const messages = {
    "one": {name: "Message one"},
    "two": {name: "Message two"},
    "three": {name: "Message three"},
    "four": {name: "Message four"}
};

let previewMessages = [];
let promises = [];

// Build the array of promises
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {
        name: message.name
    };
    previewMessages.push(messageObj);

    promises.push(func1(message).then(func2).then(info => {
        messageObj.info = info;
    }));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
    // use previewMessages
    console.log("Done! Result:", previewMessages);
});

function func1(message) {
    return new Promise(resolve => {
        // Use setTimeout for async
        setTimeout(() => {
            console.log("func1 resolving on " + message.name);
            resolve(message.name + " - func1");
        }, Math.random() * 500);
    });
}
function func2(info) {
    return new Promise(resolve => {
        // Use setTimeout for async
        setTimeout(() => {
            console.log("func2 resolving on " + info);
            resolve(info +  " - func2");
        }, Math.random() * 500);
    });
}
.as-console-wrapper {
  max-height: 100% !important;
}

순서:

const messages = {
    "one": {name: "Message one"},
    "two": {name: "Message two"},
    "three": {name: "Message three"},
    "four": {name: "Message four"}
};

let previewMessages = [];
let promise = Promise.resolve();

// Build the promise chain
for (let messageID in messages) {
    let message = messages[messageID];
    let messageObj = {
        name: message.name
    };
    previewMessages.push(messageObj);

    promise = promise.then(() => func1(message).then(func2).then(info => {
        messageObj.info = info;
    }));
}
// Wait for the last one to finish
promise.then(() => {
    // use previewMessages
    console.log("Done! Result:", previewMessages);
});

function func1(message) {
    return new Promise(resolve => {
        // Use setTimeout for async
        setTimeout(() => {
            console.log("func1 resolving on " + message.name);
            resolve(message.name + " - func1");
        }, Math.random() * 500);
    });
}
function func2(info) {
    return new Promise(resolve => {
        // Use setTimeout for async
        setTimeout(() => {
            console.log("func2 resolving on " + info);
            resolve(info +  " - func2");
        }, Math.random() * 500);
    });
}
.as-console-wrapper {
  max-height: 100% !important;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Meteorjs에서 값을 얻기 위해 Mongodb 객체를 반복합니다.

분류에서Dev

인덱스 값을 얻기 위해 객체를 루프

분류에서Dev

일치하는 키와 값을 기반으로 dataweave의 객체 배열에 대해 추가해야합니다.

분류에서Dev

총 개수를 얻기 위해 객체 속성 값의 JavaScript 배열을 추가합니다.

분류에서Dev

다른 객체의 값을 얻기 위해 if 문에서 사용할 루프의 항목 인덱스 가져 오기

분류에서Dev

객체 값을 반복하기 위해 angular.foreach를 사용하여 배열의 값을 가져옵니다.

분류에서Dev

Angular 8 프로젝트와 ngFor 루프의 템플릿에 표시 할 json 객체의 값을 가져 오는 데 문제가 있습니다.

분류에서Dev

속도를 얻기 위해 numpy 함수가이 for 루프를 대체 할 수 있습니까?

분류에서Dev

객체가 가치를 얻기 위해 프로토 타입 체인을 통과하지 않는 경우가 있습니까?

분류에서Dev

루프 사이클을 반복하기 위해 카운트 값을 줄이는 것이 작동하지 않습니다. 파이썬의 for 루프에는 continue 문이있는 예외 처리기가 있습니다.

분류에서Dev

하위 루프에 들어가기 위해 .txt 파일을 반복하는 코드를 어떻게 수정해야합니까?

분류에서Dev

R에서 for 루프를 사용하여 이름을 객체에 저장하는 데 문제가 있습니다.

분류에서Dev

요소에 클래스를 추가하기 위해 if 문을 사용하는 데 문제가 있습니다.

분류에서Dev

파이썬을 엑셀하기 위해 행 값 쓰기를 반복하면 내 코드에 어떤 문제가 있습니까?

분류에서Dev

Javascript-루프를 통해 기존 객체 속성에 더 많은 값 추가

분류에서Dev

"For 루프"와 "배열"(초급)을 혼합 한 결과를 이해하는 데 문제가 있습니다.

분류에서Dev

Entity Framework를 통해 문자열 속성에 대한 값 제약 조건을 추가 할 수 있습니까?

분류에서Dev

객체를 반복합니다. 키와 속성을 해체하고 새 속성을 추가합니다.

분류에서Dev

계속해서 값을 잃고 0을 얻습니다. 내 논리에 무슨 문제가 있습니까?

분류에서Dev

객체와 검사의 ArrayList를 통해 루프가 실행을 위해 그들의 이름은 GUI에이를 표시 할 수 있지만 오류 메시지가 계속 나타납니다

분류에서Dev

for 루프를 통해 여러 객체의 사전에 키와 값 추가

분류에서Dev

Excel을 SQL에 연결하기 위해 ODBC를 설치하는 데 문제가 있습니다.

분류에서Dev

for in 루프를 통해 가장 높은 값을 파악하는 데 문제가 있습니다.

분류에서Dev

빈 객체에 추가 할 특정 키 : 값 쌍을 얻으려면 배열을 반복해야합니다.

분류에서Dev

Php에서 필요한 배열을 생성하기 위해 for 루프를 얻을 수 없습니다.

분류에서Dev

프로그램의 특정 부분을 반복하기 위해 do while 루프를 사용하려고하는데 제대로 실행되지 않습니다.

분류에서Dev

내 불화 봇을 위해 heroku와 git에 문제가 있습니다.

분류에서Dev

내 리프트 클래스의 생성자에 대해 뭔가를 말하는 오류와 함께 Lift 객체를 만드는 데 문제가 있습니다.

분류에서Dev

약속을 반환하기 위해 AngularFireAuth에서 signInAnonymously를 얻는 방법

Related 관련 기사

  1. 1

    Meteorjs에서 값을 얻기 위해 Mongodb 객체를 반복합니다.

  2. 2

    인덱스 값을 얻기 위해 객체를 루프

  3. 3

    일치하는 키와 값을 기반으로 dataweave의 객체 배열에 대해 추가해야합니다.

  4. 4

    총 개수를 얻기 위해 객체 속성 값의 JavaScript 배열을 추가합니다.

  5. 5

    다른 객체의 값을 얻기 위해 if 문에서 사용할 루프의 항목 인덱스 가져 오기

  6. 6

    객체 값을 반복하기 위해 angular.foreach를 사용하여 배열의 값을 가져옵니다.

  7. 7

    Angular 8 프로젝트와 ngFor 루프의 템플릿에 표시 할 json 객체의 값을 가져 오는 데 문제가 있습니다.

  8. 8

    속도를 얻기 위해 numpy 함수가이 for 루프를 대체 할 수 있습니까?

  9. 9

    객체가 가치를 얻기 위해 프로토 타입 체인을 통과하지 않는 경우가 있습니까?

  10. 10

    루프 사이클을 반복하기 위해 카운트 값을 줄이는 것이 작동하지 않습니다. 파이썬의 for 루프에는 continue 문이있는 예외 처리기가 있습니다.

  11. 11

    하위 루프에 들어가기 위해 .txt 파일을 반복하는 코드를 어떻게 수정해야합니까?

  12. 12

    R에서 for 루프를 사용하여 이름을 객체에 저장하는 데 문제가 있습니다.

  13. 13

    요소에 클래스를 추가하기 위해 if 문을 사용하는 데 문제가 있습니다.

  14. 14

    파이썬을 엑셀하기 위해 행 값 쓰기를 반복하면 내 코드에 어떤 문제가 있습니까?

  15. 15

    Javascript-루프를 통해 기존 객체 속성에 더 많은 값 추가

  16. 16

    "For 루프"와 "배열"(초급)을 혼합 한 결과를 이해하는 데 문제가 있습니다.

  17. 17

    Entity Framework를 통해 문자열 속성에 대한 값 제약 조건을 추가 할 수 있습니까?

  18. 18

    객체를 반복합니다. 키와 속성을 해체하고 새 속성을 추가합니다.

  19. 19

    계속해서 값을 잃고 0을 얻습니다. 내 논리에 무슨 문제가 있습니까?

  20. 20

    객체와 검사의 ArrayList를 통해 루프가 실행을 위해 그들의 이름은 GUI에이를 표시 할 수 있지만 오류 메시지가 계속 나타납니다

  21. 21

    for 루프를 통해 여러 객체의 사전에 키와 값 추가

  22. 22

    Excel을 SQL에 연결하기 위해 ODBC를 설치하는 데 문제가 있습니다.

  23. 23

    for in 루프를 통해 가장 높은 값을 파악하는 데 문제가 있습니다.

  24. 24

    빈 객체에 추가 할 특정 키 : 값 쌍을 얻으려면 배열을 반복해야합니다.

  25. 25

    Php에서 필요한 배열을 생성하기 위해 for 루프를 얻을 수 없습니다.

  26. 26

    프로그램의 특정 부분을 반복하기 위해 do while 루프를 사용하려고하는데 제대로 실행되지 않습니다.

  27. 27

    내 불화 봇을 위해 heroku와 git에 문제가 있습니다.

  28. 28

    내 리프트 클래스의 생성자에 대해 뭔가를 말하는 오류와 함께 Lift 객체를 만드는 데 문제가 있습니다.

  29. 29

    약속을 반환하기 위해 AngularFireAuth에서 signInAnonymously를 얻는 방법

뜨겁다태그

보관