2017-11-04 7 views
1

約束事の中でjsonpリクエストをラップしています。私は一連のAPIコールを作成しています。Promise.all returned undefined

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が未定義の約束事の配列を返します。これにより、さらに値を処理することはできません。

マイJSONPの約束ラッパーはここにある:

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から値にアクセスする方法はありますか?

答えて

2

あなたは約束から何も返しません。試してみよう:

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

    userData.push(user); 

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