如何解决nodejs中多个promise或者嵌套的问题?

如果nodejs中连续查两次数据库,如果要求先查每1个,再查第2个,最后根据两次查询的结果做一些操作,怎么用promise实现呢?可以做到没有任何的二重嵌套吗?比如:

query({id:12}).then(function(data){
    console.log(data);
    query({id:13}).then(function(data2){
        doXXX();
    });
});


以上代码结果还是出现了嵌套。

如果这样写:


query({id:12}).then(function(data){
    console.log(data);
    
}).then(function(){
    query({id:13}).then(function(data2){
        doXXX();
    });
}).then(function(data){
    doXXXX();
});

由于第2个then有异步,还是不行的,会跑到第3个then里面去。

谢谢解答,下面代码是可以的:

var query=test.query('core_user',{userName:'lqq'});
    var array=new Array();
    query.then(function (data) {
        console.log(data);
        array.push(data[0]);
    }).then(function () {
        return test.query('core_user',{userName:'test3'});
    }).then(function (data) {
        console.log(data);
        array.push(data[0]);
        console.log(array);
        res.send(array);
    });
阅读 11.1k
7 个回答

Promise.all

query({id:12}).then(function(data){
    console.log(data);
    return query({id:13})
}).then(function(data){
    doXXXX();
});
return query({id: 13}).then(function(data2){
    doXXX();
}

这样OK?

query({id:12}).then(function(data){
    console.log(data);
    return query({id:13});
}).then(function(data2){
    console.log(data2);
    doXXX();
});

如果两个Promise需要前后关系的话,用上述代码,把第二个Promise return出来;
如果没有,如LS所说,用Promise.all。

Promise是一种状态,之所以可以脱离callback hell的原因是如果在Promise的回调中return了另外一个Promise, 下个回调会等待上个Promise的状态变为reject或resolve.

var queryById = function(id) {
 return new Promise(function(resolve, reject) {
    //query action
    resolve(anotherId);)
});

queryById(2)
.then(function(resultId){
  return queryById(resultId);
})
.then(function(resultId2){
  return queryById(resultId2);
})

就避免了无限深入的回调

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏