【问题标题】:Promisified API calls don't execute承诺的 API 调用不执行
【发布时间】:2019-01-21 12:39:22
【问题描述】:

我正在编写一个服务,它通过 API 调用来获取所有预订,然后从这些预订中获取所有进行这些预订的 coworkerId 的列表。然后,我获取唯一 ID 并使用它们进行另一组调用,以获取所有同事记录的数组。完成此步骤后,我将对订单项调用执行相同的操作,但是由于某种原因,我无法获取同事对象的列表。

这是我的代码:

apiService.getBookingsList(`?size=1000&from_Booking_FromTime=${weekAgo.toISOString()}`).then(bookings => {
    const bookingCoworkerIds = bookings.map(booking => booking.CoworkerId);
    const bookingCoworkerIdsUnique = bookingCoworkerIds.filter(recordParser.onlyUnique);

    const getCoworker = function getCoworkerInfo(coworkerId)  {
        return apiService.getSingleCoworker(coworkerId);
    }

    const bookingCoworkerCalls = bookingCoworkerIdsUnique.map(coworkerId => getCoworker(coworkerId));
    const bookingCoworkers = Promise.all(bookingCoworkerCalls);

    bookingCoworkers.then(coworkers => {
       console.log(coworkers.length);
       console.log(coworkers[0]);
    });
});

这里是 apiService.getSingleCoworker 的代码:

getSingleCoworker(coworkerId) {
    // returns a single coworker object given their ID
    return httpsRequest.createRequest(this.URL.coworkerList + `?Coworker_Id=${coworkerId}`, {}, this.requestHeaders, 'GET')
        .then(result => JSON.parse(result).Records[0]);
}

我也可以发布我的 https 代码,但我认为这不是问题。

我怀疑我的 Promise 模式有问题,因为我对 Promise 和一般的异步代码仍然很陌生。这些控制台日志都没有到达,而唯一的输出是:

(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): SyntaxError: Unexpected end of JSON input

那么我在这里做错了什么?

【问题讨论】:

  • SyntaxError: Unexpected end of JSON input 您验证 JSON 是否正确?看起来它没有正确捕获错误。
  • SyntaxError: Unexpected end of JSON input 表示您的result(至少其中之一)不是有效的 JSON 字符串。在尝试解析之前尝试记录它们。然后相应地修复 createRequest 或您的服务器代码。
  • 如果返回的响应无效,有没有快速修改getSingleCoworker()重试的方法?

标签: javascript node.js ecmascript-6 promise es6-promise


【解决方案1】:

使用 Promise 的想法是将“then”调用(或命令)链接起来。

为了做到这一点,一个承诺必须返回另一个承诺或一个值。

像这样:

apiService.getBookingsList(`?size=1000&from_Booking_FromTime=${weekAgo.toISOString()}`)
    .then(bookings => {
        const bookingCoworkerIds = bookings.map(booking => booking.CoworkerId);
        const bookingCoworkerIdsUnique = bookingCoworkerIds.filter(recordParser.onlyUnique);

        const bookingPromises = bookingCoworkerIdsUnique.map(coworkerId => apiService.getSingleCoworker(coworkerId));
        return Promise.all(bookingPromises);

    }).then(coworkers => {
       console.log(coworkers.length);
       console.log(coworkers[0]);
    }).catch(err => {
        // do something with error
    });

在第一个“then”回调中,我返回 Promise.all,它会生成一个 Promise。

下一个“then”接收“all”承诺的所有解析值。

请记住,promise 应始终在末尾包含一个“catch”调用,以捕获 promise 错误。

编辑

getSingleCoworker(coworkerId) {
    const self = this;
    return new Promise(function(resolve, reject) {
        httpsRequest.createRequest(self.URL.coworkerList + `?Coworker_Id=${coworkerId}`, {}, this.requestHeaders, 'GET')
            .then(result => {
                const jsonVal = JSON.parse(result).Records[0];
                resolve(jsonVal);
            }).catch(reject);
    });
}

希望对你有帮助

【讨论】:

  • 如果修改他的代码以正确捕获错误,他的代码可能会起作用,但我建议使用链接 thencatch 的这种方法
  • 我运行了你的代码,但还是做错了,我得到了同样的错误
  • 这很可能是你的 JSON 数据流,老兄,你调试/查看过你提供的 JSON 信息吗?
  • 是的,我已经通过 Postman 拨打了让同事联系的电话,并且响应看起来很好,对于使用我知道 getSingleCoworker() 的 ID 的单个电话也做了同样的事情,并得到了很好的响应。还有什么我应该尝试的吗?
  • 现在得到 (node:1) UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled PromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 104): TypeError: Cannot read property 'URL' of undefined 另外,httpsRequest.createRequest 已经返回了一个 Promise,是不是嵌套它们的好主意吗?
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多