繁体   English   中英

Promise.all([..])。then从不解决

[英]Promise.all([..]).then never resolves

我有一些看起来像这样的个人承诺:

var performancePerMonth = new Promise(function(resolve, reject) {
  var path = some_path;
  getFromApi(path);
});

他们都使用称为getFromApi()的方法执行请求:

function getFromApi(path, callback) {

  request({
    method: 'GET',
    url: base_uri + path,
    headers: { 'TOKEN': 'MY_ACCESS_TOKEN' }
  },

  function (error, response, body) {
    console.log('Status:', response.statusCode);
    console.log('Headers:', JSON.stringify(response.headers));
    console.log('Response:', body);
    return body;
});

因为我需要一起运行请求并获得包含所有结果的数组,所以我将所有单独的Promises添加到Promise.all中:

exports.perform = function(req, response) {
  Promise.all([performancePerMonth, performancePerPlayer,..]).then(function(results) {
    console.log('Then: ', results);
  }).catch(function(err) {
    console.log('ERROR Promise.all');
    console.log('Catch: ', err);
  })
};

问题是,尽管从getFromApi()方法的日志中可以看到请求执行得很好,但结果数组永远不会返回。 该方法可以运行,但是显然永远不会到达.then内部的函数.then并且这样:

console.log('Then: ', results);

永远不会达到(它下面的catch函数都没有)。

似乎程序仅在执行所有请求之前运行,而忘记返回结果。

您永远都无法兑现承诺。

var performancePerMonth = new Promise(function(resolve, reject) {
  var path = some_path;
  getFromApi(path, resolve);
});

您的getFromApi函数也有一个回调,但是它永远不会运行。 您可能想要callback(body); 而不是return body;

function getFromApi(path, callback)接受一个回调参数,因此让我们将其用作request的回调,而不是您拥有的匿名函数

function getFromApi(path, callback) {
  request({
    method: 'GET',
    url: base_uri + path,
    headers: { 'TOKEN': 'MY_ACCESS_TOKEN' }
  }, callback);
}

现在,让我们使用该匿名函数,对其进行一些修改以根据需要在performancePerMonth等中调用解析/拒绝

var performancePerMonth = new Promise(function(resolve, reject) {
    var path = some_path;
    getFromApi(path, function (error, response, body) {
        if (error) {
            reject(error);
        } else {
            console.log('Status:', response.statusCode);
            console.log('Headers:', JSON.stringify(response.headers));
            console.log('Response:', body);
            resolve(body);
        }
    });
});

您可能要检查response.statusCode是一个在盲目解决正文之前指示成功请求的代码-许多请求API都不将响应中返回的非2xx状态视为错误

因此,您可能需要

var performancePerMonth = new Promise(function(resolve, reject) {
    var path = some_path;
    getFromApi(path, function (error, response, body) {
        if (error) {
            reject(error);
        } else {
            console.log('Status:', response.statusCode);
            console.log('Headers:', JSON.stringify(response.headers));
            console.log('Response:', body);
            if (response.statusCode >= 200 && response.statusCode < 300) {
                resolve(body);
            } else {
                reject(response.statusCode);
            }
        }
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM