2017-07-05 17 views
-1

データをアレイに同期してプッシュする必要があります。最初のAPIリクエストでは、画像データをループ内で取得する必要がある画像キーベースを取得します。私はdeasyncがあなたの特定の問題を解決するためのお粗末な選択だと思うな限りノードjs asyncを同期に変換

var deasync = require('deasync'); 


     router.get('/a', function(req, res) { 
       var username="user"; 
       var passw ="pass"; 
       var op = []; 
       var args = { 
        headers: { 
        'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64') 
       } 
      }; 
     //this is first api request 
     client.get(global.apiUrl+"V1/ProductItem", args, 
     function (data, response) { 
       //this is second api request 
      data.forEach(function(img) {client.get(global.apiUrl+"V1/ImagePreview/"+img.AvatarKey,args, 
        function (data2, response){ 
           img['data']=data2.Image; 
           deasync(pushData(img)); 
          }); 
        });  
       }); 

     function pushData(img){ 
      op.push(img);//array push 
     } 
     res.render('test1', { "out":JSON.stringify(op) }); 
     }); 
+1

を使用して*」のように記述同期してデータを配列にプッシュするeed "*なぜですか?技術的にはアレイに追加するのは常に同期的ですが、周囲のすべてが同期している必要があります。 –

+2

ノードで同期して何かする必要があるときは、何かが間違っていることを知っています; P – Angels

+0

私の意見では、deasyncの著者は自分自身にアッパーカットを与える必要があります。つまり、非同期操作を識別する必要があるため、同期プッシュ操作ではなく非同期にする必要があります。 –

答えて

0

は、それを使用するための鍵は、「deasync」非同期機能です。 Array.pushは同期であるため、のArray.pushをdeasync'ingても何の意味

deasyncのドキュメントを読んだ、それは非同期を受け入れ、しかし

var deasync = require('deasync'); 
// create a sync client.get 
function syncClientGet(client, url, args) { 
    var inflight = true; 
    var ret; 
    client.get(url, args, function(data, response) { 
     // as your original code ignores response, ignore it here as well 
     ret = data; 
     inflight = false; 
    }); 
    deasync.loopWhile(() => inflight); 
    return ret; 
} 

router.get('/a', function(req, res) { 
    var username = "user"; 
    var passw = "pass"; 
    var op = []; 
    var args = { 
     headers: { 
      'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64') 
     } 
    }; 

    let data = syncClientGet(client, global.apiUrl + "V1/ProductItem", args); 
    data.forEach(function(img) { 
     let data2 = syncClientGet(client, global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args); 
     img['data'] = data2.Image; 
     op.push(img); 
    }); 
    res.render('test1', { 
     "out": JSON.stringify(op) 
    }); 
}); 

を使用するために、かなり簡単ですが行うものではありません、あなたが投稿したコードは以下のようになり簡単で

router.get('/a', function (req, res) { 
    var username = "user"; 
    var passw = "pass"; 
    var op = []; 
    var args = { 
     headers: { 
      'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64') 
     } 
    }; 
    client.get(global.apiUrl + "V1/ProductItem", args, function (data, response) { 
     data.forEach(function (img) { 
      client.get(global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args, function (data2, response) { 
       img['data'] = data2.Image; 
       op.push(img); 
       if (img.length == data.length) { 
        res.render('test1', { 
         "out": JSON.stringify(op) 
        }); 
       } 
      }); 
     }); 
    }); 
}); 

や、約束

router.get('/a', function (req, res) { 
    var username = "user"; 
    var passw = "pass"; 
    var args = { 
     headers: { 
      'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64') 
     } 
    }; 
    // create a Promisified client get 
    var clientGetPromise = function clientGetPromise(client, url, args) { 
     return new Promise(function (resolve, reject) { 
      return client.get(url, args, function (data, response) { 
       return resolve(data); 
      }); 
     }); 
    }; 

    clientGetPromise(client, global.apiUrl + "V1/ProductItem", args).then(function (data) { 
     return Promise.all(data.map(function (img) { 
      return clientGetPromise(client, global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args).then(function (data2) { 
       img['data'] = data2.Image; 
       return img; 
      }); 
     })); 
    }).then(function (op) { // op is an Array of img because that's how Promise.all rolls 
     return res.render('test1', { "out": JSON.stringify(op) }); 
    }); 
}); 
+0

ありがとうございました。その仕事。私はノードjの新しいです。あなたの助けに感謝します。 –

関連する問題