-2

私は、swagger 1 のドキュメントを swagger 2 に変換するコードをいくつか書きました。変換メソッドは、配列内の複数のリソースを指しています。私が見つけたのは、それが正しく実行されておらず、デバッガーで配列の最後 (サイズ 34) までジャンプしていることです。コードが正しくループするようにするにはどうすればよいですか?

for(var i = 0; i < resourcesArray.length; i++) {
    Converter.convert({
        from: 'swagger_1',
        to: 'swagger_2',
        source: 'http://example/' + resourcesArray[i]
    }, function (err, converted) {
        console.log(resourcesArray[i]);
        // [Optional] Fill missing fields with dummy values
        converted.fillMissing();

        // [Optional] Validate converted spec
        var fileName = resourcesArray[i] + '.json';
        fs.writeFileSync(fileName, converted.stringify());
    })
}
4

3 に答える 3

1

JavaScript スコープ ルールの犠牲になりました。これを試して:

resourcesArray.forEach(function (resource) {
    Converter.convert({
        from: 'swagger_1',
        to: 'swagger_2',
        source: 'http://example/' + resource
    }, function (err, converted) {
        console.log(resource);
        // [Optional] Fill missing fields with dummy values
        converted.fillMissing();

        // [Optional] Validate converted spec
        var fileName = resource + '.json';
        fs.writeFileSync(fileName, converted.stringify());
    });
});

問題は、非同期コールバックfunction (err, converted) { ... }が発生するまでに、反復がすでに完了しているため、i等しいということでした。resourcesArray.lengthこれが、JavaScript でvar宣言された変数がどのように機能するかです。ループを使用すると、その操作に期待forEachするものが常にスコープに含まれるようになりresourceます。

または、ES6 が問題ない場合は、に変更varするletこともできます。let宣言された変数はレキシカル スコープを使用するため、for ループ ブロックにはi、非同期コールバック内で使用されている場合でも、期待される値が常に含まれます。

于 2016-07-19T15:33:17.267 に答える
-2

forこれは、ループ内に非同期呼び出しがあるために発生している可能性があります。i反復ごとにの値を固定する必要があります。これに使えますclosure()。すべての反復がいつ完了したかを追跡したい場合は、カウンターを保持できます: var counter = resourcesArray.length; for(var i = 0; i < resourcesArray.length; i++) { var resources = resourcesArray[i];

  (function( resources, i ){
     Converter.convert({
        from: 'swagger_1',
        to: 'swagger_2',
        source: 'http://example/' + resources
    }, function (err, converted) {
        console.log(resources);
        // [Optional] Fill missing fields with dummy values
        converted.fillMissing();

        // [Optional] Validate converted spec
        var fileName = resources + '.json';
        fs.writeFileSync(fileName, converted.stringify());

        counter--;
        if( counter <= 0 )
        {
          //next();
        }
    })
  })(resources, i );    
}//for
于 2016-07-19T15:23:45.353 に答える