无法解析JavaScript中的内部承诺

时间:2018-08-05 12:40:27

标签: javascript promise

无法解决或超出内部承诺,因此我可以将数据发送回客户端。

代码:

dplyr

在第10行第tibble条中解决了诺言之后,数据就再也不会发送了:内部诺言有问题,但是我不确定是否要解决它?

2 个答案:

答案 0 :(得分:1)

似乎您正在混合使用回调和Promises。我建议包装所有对Promises的呼叫。

从外观上看,您不需要内部Promise,因为request需要回调,因此您可以轻松地解决外部回调。

您还拥有if语句的某些分支,这些分支不调用resolve或拒绝(在下面的代码中带有注释的标记)。您必须在所有分支中调用“解决/拒绝”,否则Promise可能“无所事事”,以防分支击中分支。

function getAmazonData(url, isRatings) {
  var parsedData;
  var ItemLookup;
  var ratingsURL;

  return new Promise(function (resolve, reject) {
    request(url, function (err, response, body) {
      if (err) return reject(err);
      parseXML(body, function (err, parsedData) {
        if (err) return reject(err);
        ItemLookup = parsedData['ItemLookupResponse'];

        if (ItemLookup && ItemLookup.Items && ItemLookup.Items.length > 0) {
          // Request Error
          if (ItemLookup.Items[0].Request && ItemLookup.Items[0].Request.length > 0 && ItemLookup.Items[0].Request[0].Errors) {
            reject(ItemLookup.Items[0].Request[0].Errors);
          } else if (ItemLookup.Items[0].Item) {
            ratingsURL = ItemLookup.Items[0].Item[0].CustomerReviews[0].IFrameURL[0];
            if (isRatings) {
              console.log('getting ratings...');
              request(ratingsURL, { json: true }, function (ratingsError, ratingBody) {
                if (ratingsError) {
                  reject(new Error('Error in getting ratings'));
                  return;
                }
                ItemLookup.Items[0].Item[0].CustomerReviews.push({ Ratings: ratingBody });
                resolve(ItemLookup.Items[0].Item[0].CustomerReviews);
              });
            } else {
              console.log('Resolved: ', ItemLookup.Items[0].Item);
              resolve(ItemLookup.Items[0].Item);
            }
          } else {
            // resolve or reject here
          }
        } else {
          // resolve or reject here
        }
      });
    });
  });
}

包装对承诺的呼吁:

function requestAsPromised(url) {
  return new Promise(function (resolve, reject) {
    request(url, function (err, response, body) {
      if (err) {
        reject(err);
      } else {
        resolve(body)
      }
    });
  })
}

答案 1 :(得分:0)

您需要使用return返回内部承诺,

function getAmazonData(url, isRatings) {
    var parsedData;
    var ItemLookup;
    var ratingsURL;

    return new Promise(function (resolve, reject) {
        return request(url, function (err, response, body) {
            if (err) return reject(err);
            return parseXML(body, function (err, parsedData) {
                if (err) return reject(err);
                ItemLookup = parsedData['ItemLookupResponse'];

                if (ItemLookup && ItemLookup.Items && ItemLookup.Items.length > 0) {
                    // Request Error
                    if (ItemLookup.Items[0].Request && ItemLookup.Items[0].Request.length > 0 && ItemLookup.Items[0].Request[0].Errors) {
                        return reject(ItemLookup.Items[0].Request[0].Errors);
                    } else if (ItemLookup.Items[0].Item) {
                        ratingsURL = ItemLookup.Items[0].Item[0].CustomerReviews[0].IFrameURL[0];
                        if (isRatings) {
                            console.log('getting ratings...');
                            return new Promise(function (resolve2, reject2) {
                                request(ratingsURL, { json: true }, function (ratingsError, ratingBody) {
                                    if (ratingsError) {
                                        return reject2('Error in getting ratings');
                                    }
                                    ItemLookup.Items[0].Item[0].CustomerReviews.push({ Ratings: ratingBody });
                                    resolve2(ItemLookup.Items[0].Item[0].CustomerReviews);
                                });
                            });
                        }
                        console.log('Resolved: ', ItemLookup.Items[0].Item);
                        return resolve(ItemLookup.Items[0].Item);
                    }
                }
            });
        });
    });
}

由于它看起来像Node.js代码,因此请尝试使用async/await