nodejs能否等待异步执行结束

现在是有好几个函数,里面都是执行异步函数。

我就想把这个函数里面的值返回,当然嘛,由于是异步,还没等执行完就关了,所以外面也拿不到值。

之前是问了前端说是传进去你想执行的方法,或者值就行了,一步步往进传。

后来我用了promise,虽然这玩意是能帮助我分开,

但是我现在在第一个的then里又是一个返回promise的函数,又得then,还是造成了层层嵌套。

用了链式也就那样。虽然这三个函数是有顺序的,但是有时候不是需要第一个函数,
但不一定要前两个执行,就是我这后两个都是通过传参数进去来执行相应的方法。
用promise不就绑死了吗。

难道我要写两个链式,分别是123 23 。这样的话不就冗余了吗。

有没有什么依赖可以帮助解决这个问题

阅读 18.9k
6 个回答

试试使用co模块或者用es7的await函数

非要用async await么。
感觉语义的清晰程度上是不如.then.then.then的

理论上说 Promise 会嵌套,但不是层层嵌套,比如

new Promise( resolve => {
  doFirstThing( err => {
    resolve();    
  })
})
  .then( () => {
    return new Promise( resolve => {
      doSecondThing( err => {
        resolve();
      });
    });
  })
  .then( () => {
    return new Promise( resolve => {
      doThirdThing(err => {
        resolve();
      });
  })
  .then( () => {
    doOtherThings();
  })
  .catch( err => {

  });

如果还要其它东西,就顺序增加就是了。


更新:

如果有时候 ABC,有时候 BC,可以使用 Promise.resolve() 方法。

let first = condition ? Promise.resolve(condition) : doFirst();
first.then( () => {
  return second();
})
  .then( () => {
    return third();
  })
  ....

使用ES7的async/await语法吧。

这个语法的设计理念就是等异步任务完成再往下运行代码。相当于用同步的方式来写处理异步代码!和你想要的一样。不过,它也是要借助Promise这个东西。

function A(callback){
    setTimeout(function(){
        var resultValue="AAA";
        if(Math.floor(Math.random()*10)%2){
           resultValue="AAA";
        }else{
            resultValue="AAAA";
        }
        callback&&callback.apply(null,[resultValue]);
    },1000);
}

function B(input_value,callback){
    setTimeout(function(){
        callback&&callback.apply(null,["BBB"]);
    },1000);
}


function C(input_value,callback){
    setTimeout(function(){
        callback&&callback.apply(null,["CCC"]);
    },1000);
}

var promiseA=new Promise(function(resolve,reject){
   A(function(resultValue){
       resolve(resultValue);
   });
});

var promiseB=promiseA.then(function(resultValueA){
    if(resultValueA=="AAA"){
        
        return new Promise(function(resolve,reject){
            //执行B
            B(resultValueA,function(result){
                console.log("~~执行B~~");
                resolve(result);
            });
        });
    }else if(resultValueA=="AAAA"){
        return new Promise(function(){
            //或者执行C
            C(resultValueA,function(result){
                console.log("~~执行C~~");
                resolve(result);
            });
        });
        
    }
});

promiseB.then(function(result){
    console.log("~~~BBB~~~"+result);
});

先执行A函数,根据A函数的返回结果根据逻辑执行B还是C

感觉你需要的是 Promise.all

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