2

私はこのようなコードを持っています..いくつかのコンテンツを取得し、すべてがロードされた後、何かをしたいと思います。そのため、Promise.all を使用して、後で解決された値にアクセスします。しかし、それは値を与えていますが、Promise {' content here'} のようです。(console.log を参照してください。) 正規表現を使用して抽出するつもりでしたが、文字列ではなくキーのないオブジェクトの型を確認しますか? なんで?

      var request=require('request');

      var urls=['someurl','someurl2','someurl3'];
      var contents=[];

      urls.forEach(function (u) {
      contents.push(getContent(u) );
      });

      Promise.all(contents)
      .then(function () {
        // All should be loaded by now?

       // Promises which are resolved are fulfiled, and values can be accessed later right?
       contents.forEach(function (promise) {
       var content = Promise.resolve(promise);
        console.log(content); // Promise {'test'} ??
        console.log(typeof content,Object.keys(content));
        // object [] ???
      });

      }).
      catch(function(err) {
       //handle error here

      });



      function getContent(url) {
       return new Promise ( function (resolve,reject) {
        /** commented and stripped out for testing
        request(url, function (err,response, data) {
         if(err) {
          reject(Error(err));
         }

       }); **/
       resolve("test");
       });
       }
4

2 に答える 2

4

contentsまだ約束だけを保持します。
promise の値を直接抽出することはできません。コールバックからのみ消費できthen()ます。

代わりに、結果の配列のPromise.all()promise を返します。

then()その配列をコールバック パラメータとして受け取り、それを直接使用するように呼び出しを変更します。

于 2015-07-13T17:23:20.407 に答える
1

まず第一に、間違った方法で結果にアクセスしています:

Promise.all(contents).then( function(data) {
    // data holds an array with the return values of the promises
    console.log(data);
});

2 つ目: Promise を正しく作成していません。基本的に、getContent()関数内でそれらを解決していないため、必要なデータを取得することはできません!

function getContent(url) {
       return new Promise ( function (resolve,reject) {
        request(url, function (err,response, data) {
         if(err) {
            // reject the promise in case of error
            reject(Error(err));
         } else {
            // resolve the promise with the output you need
            resolve(data);
         }
});

を呼び出すresolve()と、promise が解決され、入力が渡されます。で指定したすべての promisePromise.all()が解決されると、コールバックが実行され、 で返されたデータにアクセスできるようになりますresolve()

于 2015-07-13T17:31:34.993 に答える