Promise中的request.post方法跳出来

时间:2016-08-16 15:21:56

标签: javascript node.js promise es6-promise

人:

最近我遇到了一个问题,让我们先看看我的代码:

var foo = function () {
    var promise = new Promise(function (resolve, reject) {

        request.post(
            someAddress,
            { form: someData },

            function (error, res, body) {

                responseHandler(error, res, body, resolve, reject);
            });
    });

    return promise;
};

function responseHandler(error, res, body,resolve,reject) {
    if (error || res.statusCode != 200) {
        try {
            if (res) {
                error = error || { error: res.statusMessage };
                error.statusCode = res.statusCode || 204;
                reject(error);
            }
            else {
                reject({
                    statusCode: 204,
                    message: 'Unspecified Error'
                });
            }
        }
        catch (ex) {
            reject(ex);
        }
    }
    else {
        try {
            resolve(body ? JSON.parse(body) : '')
        }
        catch (ex) {
            reject(ex);
        }
    }
}

所以这是我的代码。当它运行到request.post时,它会跳出foo。

  • 我的编码错误导致了问题,还是我遗失了什么?

  • 我希望它留下并等待回复,以便我可以运行foo(),我该怎么办?

实际上,整个代码将是:

function bar() {
 var promise = new Promise(function(resolve, reject) {
  foo().then(doSth and resolve);
 })
  return promise;
 }

然后我在另一个承诺中使用了bar,如:

   function chain() {
     somePromise()
      .then(bar)
      .then(anotherPromise)
      .then(...);
   }

最后它与

相关
 promiseA
  .then(chain)
  .then(promiseB)
  .then(promiseC)

当我的代码在bar()中运行并潜入foo()时,它会发布内容并跳出chain()并直接浏览promiseBpromiseC

只有收到回复后,代码才会返回responseHandler()

我尝试了setTimeout()之类的

 promiseA
  .then(function(){
     setTimeout(
       chain(),
       400
     );
   })
  .then(promiseB)
  .then(promiseC)

确实有效,但代码在chain()之后停止,从未见过promiseBpromiseC

1 个答案:

答案 0 :(得分:0)

foo()将(立即)返回一个promise,表示未来的响应值。

如果您想等待该值可用,则需要使用.then()等待它:

foo().then(body => { ... });