简体   繁体   中英

Promise.map not waiting for resolution before proceeding to .then()

I've had a problem trying to wrap my mind around JavaScript promises. Here is my lately frustration:

var rp = require('request-promise');

function process1000() {
    //gets 1000 objects from DB to process
    get1000objects()
    .then(function (docs) {
        Promise.map(docs, addApiData)
        })
    .then(function (objects) {
            console.log(objects)
        })
    }

function addApiData(element) {
    return rp(url).then(function (res) {
        resolve(res);
    })
        .catch(console.error);
}

When rp(url) is called in addApiData(), it doesn't wait until the function is resolved before beginning the next item in the array that I'm passing to Promise.map in process1000(). As soon as rp(url) is called in addApiData, addApiData is called on the next item in the array. The second .then() function in process1000 is then called, prematurely before everything has had a chance to resolve in Promise.map. I've tried a few different libraries to make my GET request but they're all having this same issue. What am I doing wrong here? Any help would be greatly appreciated.

I think you're looking for something more like this:

var rp = require('request-promise');

function process1000() {
    //gets 1000 objects from DB to process
    get1000objects()
    .then(function (docs) {
        return Promise.map(docs, addApiData)
    })
    .then(function (objects) {
        console.log(objects);
    })
}

function addApiData(element) {
    return rp(url)
    .catch(console.error);
}

The main point here is that you need to make sure you're returning the promises, or the next then won't know what to do with its value.

Also, try to avoid the Promise constructor antipattern .

In other words, if you return a promise, you don't need to return then as well.

These two are equivalent:

return rp(url).then(function(res) { return res; });

// and

return rp(url);

They both return a promise ( rp(url) returns a promise, and rp(url).then( /* ... */) returns a promise).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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