2017-05-16 16 views
0

node.jsとjavascriptの新しいビット。私のforeachに、リモート呼び出しを行う関数を呼び出させようとしています。私はそれぞれの間に遅れがあるようにしたいが、設定されたタイムアウトをどこに置くべきか分からない。Node.jsタイムアウト付き非同期iteratee

私は、以下の間違った場所に私のsetTimeoutを持っているが、それを例として入れていることは分かっている。

var likeRecommendation = function (recommendation, callback) { 
    context.Client.like(recommendation._id, function (error, data) { 
     recommendation['drupal_user_uid'] = context.message.uid; 
     recommendation['drupal_user_uuid'] = context.message.uuid; 
     if (error) return callback(new Error('Could not like recommendations')); 
     context.broker.publish('saves_swipes_publication', recommendation, function (err, publication) { 
      if (err) return callback(new Error('Could queue swipes to save')); 
       publication.on('error', console.error); 
      }); 
      console.log('Liked!'); 
      return callback() 
     }); 
    } 

    async.forEach(context.recommendations, likeRecommendation, function (error) { 
     if (!error) return done(null); 
     done(new Error('Could not like recommendations')); 
    }); 
} 
+0

どちら 'リターン行わ()の勧告を好きではないでした '新しいError();'や 'あなたが呼び出す必要があるときに実際にerr'がお手伝いします投げる'私はできなかった良い点をだ – Bergi

+0

をcallback' interatee関数のエラーをどうやって解決するのですか? –

答えて

0

setTimeoutは、コールバックコードの末尾に配置する必要があります。だから、解決策を、むしろ "async.forEach" よりも "async.eachSeries" を使用した

var likeRecommendation = function (recommendation, callback) { 
    context.Client.like(recommendation._id, function (error, data) { 
     recommendation['drupal_user_uid'] = context.message.uid; 
     recommendation['drupal_user_uuid'] = context.message.uuid; 
     console.log(recommendation); 
     if (error) return done(new Error('Could not like recommendations')); 
     context.broker.publish('saves_swipes_publication', recommendation, function (err, publication) { 
     if (err) throw err 
     publication.on('error', console.error); 
     }); 
     console.log('Liked!'); 
     return callback() 
    }); 
} 

function iterateWithTimeout(list, ctx, timeoutDuration) { 
    var currentIndex = 0; 
    (function invoke() { 
    list[currentIndex](ctx, function(error) { 
     if (!error) return done(null); 
     done(new Error('Could not like recommendations')); 
     setTimeout(function() { 
     if (++currentIndex < list.length) { 
      invoke(); 
     } 
     }, timeoutDuration); 
    }); 
    })(); 
} 

// Interval is 1 second for now 
iterateWithTimeout(context.recommendations, likeRecommendation, 1000); 
+0

これは何をしているのか分かりますが、それはうまくいくとは思えません。 ReferenceError:indexが定義されていません invoke(/Users/Scott/Sites/swiper/swipes_workflow/src/tasks/likeRecommendations.js:25:26) –

+0

@ScottHooker申し訳ありませんが、私は間違った変数名を持っています。私はちょうどそれを修正するコードを更新しました。 –

+0

コールバックが呼び出され、ワー​​クフローの次のステップが開始される前に、この「タスク」が終了する必要があるため、asyncを使用する必要があります。 –

0

はここで可能な解決策である(それがない使用async.forEachしないことに注意してください)!

いつも助けてくれてありがとう!

0

タイムアウトを参照してください。コールバックが欠落していて、他の1つがうまく配置されていないことを警告します。

var likeRecommendation = function (recommendation, callback) { 
    context.Client.like(recommendation._id, function (error, data) { 
     recommendation['drupal_user_uid'] = context.message.uid; 
     recommendation['drupal_user_uuid'] = context.message.uuid; 
     if (error) 
      setTimeout(function(){return callback(new Error('Could not like recommendations'))}, 100); 
     else { 
      context.broker.publish('saves_swipes_publication', recommendation, function (err, publication) { 
       if (err) 
        setTimeout(function(){return callback(new Error('Could queue swipes to save'))}, 100); 
       else 
       { 
        publication.on('error', console.error); 
        setTimeout(function(){ return callback();}, 100); 
       } 

      }); 
     } 
    }); 
} 

async.forEach(context.recommendations, likeRecommendation, function (error) { 
    if (!error) return done(null); 
    done(new Error('Could not like recommendations')); 
}); 
} 
関連する問題