在已履行的承诺中获得未定义的价值

Getting undefined values in fulfilled promises

我得到未定义的兑现承诺值:

0: {status: "fulfilled", value: undefined}
1: {status: "fulfilled", value: undefined}
2: {status: "fulfilled", value: undefined}
3: {status: "rejected", reason: TypeError: Failed to fetch}
4: {status: "rejected", reason: TypeError: Failed to fetch}
5: {status: "rejected", reason: TypeError: Failed to fetch}

如何获取兑现的promise的value属性中的数据?

编辑: 我添加了 return dataObj 语句,但无济于事。

var fetchArr = [];

var url1 = "url1";
fetchArr.push(fetch(url1).then(
    response => {
        response.json().then(function(data) {
            var dataObj = {};
            dataObj.playlistNumber = i;
            dataObj.data = data;

            return dataObj;
        });
    }
));

var url2 = "url2";
fetchArr.push(fetch(url2).then(
    response => {
        response.json().then(function(data) {
            var dataObj = {};
            dataObj.playlistNumber = i;
            dataObj.data = data;

            return dataObj;
        });
    }
));

var url3 = "url3"
fetchArr.push(fetch(url3).then(
    response => {
        response.json().then(function(data) {
            var dataObj = {};
            dataObj.playlistNumber = i;
            dataObj.data = data;

            return dataObj;
        });
    }
));


Promise.allSettled(fetchArr).then(function(dataArr) {
    console.log(dataArr);
});


// Polyfill for Promise.allSettled
if (!Promise.allSettled) {
    const rejectHandler = reason => ({ status: "rejected", reason });
    const resolveHandler = value => ({ status: "fulfilled", value });

    Promise.allSettled = function(promises) {
        const convertedPromises = promises.map(p => Promise.resolve(p).then(resolveHandler, rejectHandler));
        return Promise.all(convertedPromises);
    };
}

在你的第一个回调中,然后打电话给你 return 任何事情:

fetchArr.push(fetch(url1).then(
    response => {
        // There is no return here 
        response.json().then(function(data) {
            var dataObj = {};
            dataObj.playlistNumber = i;
            dataObj.data = data;

            return dataObj;
        });
    }
));

所以如果你这样做它会起作用:

fetchArr.push(
    fetch(url1).then(response => {
        // return here
        return response.json().then(function(data) {
            var dataObj = {};
            dataObj.playlistNumber = i;
            dataObj.data = data;

            return dataObj;
        })
    })
);
    

关于链式 Promise 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#chained_promises