在承诺解决之前,您如何等待返回值?

时间:2016-06-13 21:41:08

标签: javascript callback promise asynccallback

我试图编写一个函数,该函数不会返回它的值,直到函数内部的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,直到所有回调被调用?

我已经看到很多关于等待的东西。这有必要吗?将其他库添加到我的项目中是非常不受欢迎的。

2 个答案:

答案 0 :(得分:2)

由于您返回所有配置文件名称的操作也是异步的,因此当使用Promise.all

完成所有其他异步操作(或在其中一个被拒绝时拒绝)时,您应该返回一个Promise
   paramFile =io.TextIOWrapper(request.FILES['pic'].file)
   portfolio1 = csv.DictReader(paramFile)
   print(type(paramFile))
    users = []
    users = [row["BASE_NAME"] for row in portfolio1]
    print(len(users))

答案 1 :(得分:0)

  

有没有办法让函数等到返回g,直到所有回调都被调用?

是的,有。但是你应该改变你的思维方式,从“等待所有回调被调用”到“等待所有承诺完成”。事实上,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;
         });
    });
}