javascript - Promise.all 返回未定义

标签 javascript promise jsonp es6-promise

我已将 jsonp 请求包装在一个 promise 中,并且我正在进行一系列 API 调用,我希望在所有问题都得到解决后进一步处理这些问题。

 var users = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "habathcx", "RobotCaleb", "noobs2ninjas", "twitchpresents"]

Promise.all(users.map(function(user){
    var url = "https://wind-bow.gomix.me/twitch-api/users/" + user;
    return jsonp(url);
})).then(function(arr){
    console.log(arr);
})

它返回 PromiseValue 未定义的 promise 数组,这不允许我进一步处理这些值。

我的 JSONP promise 包装器在这里:

 var count = 0;

var jsonp = function(url, options) {
    options = options || {};

    var prefix = options.prefix || '__jp';
    var param = options.param || 'callback';
    var timeout = options.timeout ? options.timeout : 15000;
    var target = document.getElementsByTagName('script')[0] || document.head;
    var script;
    var timer;
    var cleanup;
    var cancel;
    var promise;
    var noop = function() {};

    // Generate a unique id for the request.
    var id = prefix + (count++);

    cleanup = function() {
        // Remove the script tag.
        if (script && script.parentNode) {
            script.parentNode.removeChild(script);
        }

        window[id] = noop;

        if (timer) {
            clearTimeout(timer);
        }
    };

    promise = new Promise(function(resolve, reject) {
        if (timeout) {
            timer = setTimeout(function() {
                cleanup();
                reject(new Error('Timeout'));
            }, timeout);
        }

        window[id] = function(data) {
            cleanup();
            resolve(data);
        };

        // Add querystring component
        url += (~url.indexOf('?') ? '&' : '?') + param + '=' + encodeURIComponent(id);
        url = url.replace('?&', '?');

        // Create script.
        script = document.createElement('script');
        script.src = url;
        target.parentNode.insertBefore(script, target);

        cancel = function() {
            if (window[id]) {
                cleanup();
                reject(new Error('Canceled'));
            }
        };

    });

    return {
        promise: promise.then(function(data){
            var user = {
                name: data.name,
                logo: data.logo,
            };


           userData.push(user);
        }),
        cancel: cancel
    };
}

我可以从单个 API 调用中推送结果,但是有没有一种方法可以访问 Promise.All 中的值?

最佳答案

你不会从 promise 中返回任何东西。试试这个:

promise: promise.then(function(data){
  var user = {
    name: data.name,
    logo: data.logo,
  };

  userData.push(user);

  return user; // <-- pass data further
}),

关于javascript - Promise.all 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47110560/

相关文章:

javascript - 不理解 ko.observables

http - 有什么理由使用 JSONP 而不是 CORS 吗?

javascript - 明显的jsonp xss漏洞

jQuery - 消耗 JSON 资源 - 有些返回数据,有些则不返回。为什么?

javascript - 用 jQuery 替换 href 元素

javascript - 如何使用 VPN 测试 javascript 地理定位?

javascript - 通过独特的链接使 Google map 标记可点击

javascript - Promise 只是让异步代码同步吗?为什么不直接使用同步代码呢?

vue.js - [Vue warn] : Invalid prop: type check failed for prop "Items". 预期的数组,得到了 Promise

javascript - (Nodejs + Restify)发送后无法设置标题 - promise 拒绝警告