簡體   English   中英

您如何等待返回值,直到承諾得到解決?

[英]How do you wait to return a value until promise is resolved?

我正在嘗試編寫一個函數,直到函數內部的Promise得到解決,該函數才返回其值。 這是我要執行的操作的簡化示例。

'use strict';

function get(db, id) {
     let p = db.command('GET', 'group:${id}');
     p.then(g => {
         g.memberNames = [];
         g.members.forEach(id => {
             User.get(db, id)
                 .then(profile => g.memberNames.push(profile.name))
                 .catch(err => reject(err));
         });
         return g;
    });
}

該函數請求一個組ID,並返回該組的數據。 在此過程中,它還將用戶名扔到數據結構中以顯示其名而不是用戶ID。 我的問題是,這是異步運行的,將跳過.then回調。 到返回g時,尚未調用任何回調,並且g.memberNames仍為空。 有沒有辦法讓函數等待返回g,直到所有回調都被調用?

我已經看到了很多有關等待的內容。 這里有必要嗎? 將其他庫添加到我的項目中是非常不希望的。

由於您的操作返回所有的配置文件名稱也是異步你應該返回與做了履行承諾當所有任務完成其他異步操作(或拒絕時,其中一個被拒絕) Promise.all

function get(db, id) {
  let p = db.command('GET', 'group:${id}');
  return p.then(g => {
    return Promise.all(g.members.map(id => {
      // NOTE: id is shadowing the outer function id parameter
      return User.get(db, id).then(profile => profile.name)
    })
  })
}

有沒有辦法讓函數等待返回g直到所有回調都被調用?

就在這里。 但是您應該將思維方式從“ 等待直到所有回調都被調用 ”更改為“ 等待直到所有諾言都實現 ”。 確實, Promise.all函數可以Promise.all地做到這一點-它接受一個promise數組,並返回一個新的promise,並以結果數組進行解析。

在您的情況下,

function get(db, id) {
     return db.command('GET', 'group:${id}').then(g => {
         var promises = g.members.map(id => {
//                                ^^^ never use `forEach`
             return User.get(db, id).then(profile => profile.name);
//           ^^^^^^ a promise for the name of that profile
         });
         //
         return Promise.all(promises).then(names => {
//                                    ^^^^^^^^^^ fulfills with an array of the names
             g.memberNames = names;
             return g;
         });
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM