Promise跳出中的request.post方法

request.post method in a Promise jump out

本文关键字:request post 方法 Promise      更新时间:2023-09-26

伙计们:

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

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

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

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

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