承诺的API调用无法执行

时间:2018-08-14 15:36:53

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

我正在编写一个服务,该服务进行API调用以获取所有预订,然后从这些预订中获取所有进行这些预订的同事ID的列表。然后,我获取唯一的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代码,但是我认为这不是问题。

我怀疑我的诺言模式做错了,因为我对诺言和异步代码一般还是陌生的。这些控制台日志均未到达,而是唯一的输出是:

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

那我在做什么错了?

1 个答案:

答案 0 :(得分:0)

使用诺言的想法是链接“ then”调用(或命令)。

为此,一个promise必须返回另一个promise或一个值。

赞:

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,它产生一个承诺。

下一个“ 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);
    });
}

希望这会有所帮助