2

ノード js では、 for loop 内に aws API 呼び出しがあります。

var prodAdvOptions = {
        host : "webservices.amazon.in",
        region : "IN",
        version : "2013-08-01",
        path : "/onca/xml"
    };
    prodAdv = aws.createProdAdvClient(awsAccessKeyId, awsSecretKey, awsAssociateTag, prodAdvOptions);
    var n=100//Just for test
    for (var i = 0; i <=n; i++) {
        prodAdv.call("ItemSearch", {
            SearchIndex : "All",
            Keywords : "health,fitness,baby care,beauty",
            ResponseGroup : 'Images,ItemAttributes,Offers,Reviews',
            Availability : 'Available',
            ItemPage : 1

        }, function(err, result) {

            if (err) {
                console.log(err);
            } else {
                console.log(result);
            }
        });
    }

期待される結果は、最初の結果が値を返した後、2 番目の呼び出し要求が実行されることです。しかし、ここでは要求/応答が非同期で実行されていました。前の呼び出しが応答を返すまで次の結果を待機させる方法。遅くても大丈夫。

4

2 に答える 2

2

forループとして async.whilst() を使用できます。このようなもの:

var async = require('async');

var prodAdvOptions = {
    host : "webservices.amazon.in",
    region : "IN",
    version : "2013-08-01",
    path : "/onca/xml"
};
var prodAdv = aws.createProdAdvClient(awsAccessKeyId, awsSecretKey, awsAssociateTag, prodAdvOptions);

var n=100;//Just for test
var i = 0;  // part 1 of for loop (var i = 0)
async.whilst(
    function () { return i <= n; },  // part 2 of for loop (i <=n)
    function (callback) {
        prodAdv.call("ItemSearch", {
            SearchIndex : "All",
            Keywords : "health,fitness,baby care,beauty",
            ResponseGroup : 'Images,ItemAttributes,Offers,Reviews',
            Availability : 'Available',
            ItemPage : 1
        }, function(err, result) {
            if (err) {
                console.log(err);
            } else {
                console.log(result);
            }
            i++;          // part 3 of for loop (i++)
            callback();
        });
    },
    function (err) {
        console.log('done with all items from 0 - 100');
    }
);
于 2016-02-02T06:04:58.347 に答える
1

コールバックの代わりにプロミスを使用したい場合は、コード実行のフローを定義する外部ライブラリを必要とせずに、単純に再帰を使用して同期を実現できます。

へのコールバックでそれを行うことができますが、コードはひどく見えます。

于 2016-02-02T06:59:36.173 に答える