2017-08-31 5 views
0

呼び出し元関数を取得し、非同期呼び出しがコールバック関数として渡す必要がなくなった後で再実行する方法が、vanilla Javascript(ES5)にありますか?JS呼び出し元関数を取得し、非同期コールバックとして再実行

私はシステム上にキャッシュ機構を構築していますが、何らかの理由で約束、es6のジェネレータ機能などを使用することはできません。

今、私はそれをこのように(これは非常に単純化されたバージョンである)をコードしています:私は「右のjavascriptの道」それをコーディングしていた場合、私はわからない

var cache = {}; 
var cacheCallbackQueue = []; 

var theCallerFunction = function(someParam){ 

    loadCache("aDataTarget",function(){ 
     theCallerFunction(someParam); 
    }); 

    // cache will be used here somehow 
    // if the needed cache haven't been loaded 
    // the async cacher should re-execute this caller function after the caching is complete 
} 

var anotherCallerFunction = function(anotherParam){ 

    loadCache("anotherDataTarget",function(){ 
     anotherCallerFunction(anotherParam); 
    }); 

} 

var loadCache = function(cacheId,callback){ 

    asyncCall(cacheId, function(result){ 
     cache[cacheId] = result; 

     cacheCallbackQueue.push(callback); 
     // is there a way to get the caller function automatically 
     // without the need to pass it as callback function on the parameter 

     checkCachingStatus(); 
    }) 

} 

// check if caching is completed, 
// if the caching is completed, 
// it will execute all previously queued callback function 
var checkCachingStatus = function(){ 
    var cachingStatus = "complete"; 
    if(!cache["aDataTarget"] || !cache["anotherDataTarget"]){ 
     cachingStatus = "incomplete"; 
    } 

    if(cachingStatus === "complete"){ 
     for(var key in cacheCallbackQueue){ 
      cacheCallbackQueue[key](); 
     } 
    } 
}; 

theCallerFunction("whatever"); 
anotherCallerFunction(666); 

を別の提案

+2

ES2015はかなりモダンで、私はあなたがES5を意味すると仮定します。 – Keith

+0

***なぜ*** "コールバック関数として渡す必要はありません"?それは...あなたがこれをどうやってやっているかです。 –

答えて

0

のためのオープンは、呼び出し元関数を取得し、非同期呼び出しは、コールバック関数として渡しすることなく行われた後、再度それを実行するためにバニラのJavascript(ES2015)での方法はありますか?

標準のJavaScriptにはありません。いくつかのJavaScriptエンジンが追加された非標準の拡張モジュールがありましたが、標準ではなく厳格モードでは禁止されています。caller

私は「右のjavascriptの道」それをコーディングしていた場合、私は別の提案

のために開いている「右のJavaScriptの方法」のカップルがありますことを確認していない:

  • あなたが行うにはしたくないと述べました、loadCacheに関数を渡す(しかし、あなたはやっているもの)
  • てきたが、イベントにsubcribingの手段を提供するオブジェクトを返しloadCache、と持っています」再あなたが購読できる「試してみてください」イベント。しかし、イベントをサブスクライブすると、それは不明だあなたは

はすべてのことを言って:-)行うにはしたくないと述べました...、でハンドラ関数を渡すことを意味し、なぜloadCacheを希望呼び出された関数を再呼び出しするためにはが必要です。これを処理する標準的な方法は約束を使うことです(polyfillでES5で使うことができます; polyfillはそれほど大きくありません)。loadCacheは約束を返し、それを呼び出すコードはそれを使用します:

var theCallerFunction = function(someParam) { 
    loadCache(/*...*/) 
     .then(function(data) { 
      // Use `data` here 
     }) 
     .catch(function() { 
      // Handle failure here 
     }); 
    // Probably no code here, since you want to wait for the cached information 
}; 

または発信者は、エラーを処理する必要がある場合:

var theCallerFunction = function(someParam) { 
    return loadCache(/*...*/) 
     .then(function(data) { 
      // Use `data` here 
     }); 
}; 
関連する問題