2016-06-12 8 views
0

私は自分のNode.jsサーバー上、次のようないくつかのブログの記事を読んだ後、より良いコードを書くためにしようとしてきた:q-「defer.resolve(myData); return defer.promise;」のように返す場合VSは、単に約束チェーンで「MYDATAを返す」

は、私はまだわかりません。

それがこの

ケース1

var promise = function() { 
    var defer = q.defer(); 
    var myData = "hi" 
    defer.resolve(myData); 
    return d.promise; 
}; 

またはこのようなような約束の下のデータを返すか、渡すために適切だときに私が言うことはできません。

ケース2

var promise = function() { 
     var myData = "hi" 
     return myData; 
    }; 
私は仮定してい

は、私が何かを知っている場合はそのある場合に約束チェーンが、その後破るケース2を使用することができませんどこ返されますがということですそれが失敗する可能性がある変更(つまり、ネットワークコールからのデータを返していますが、ユーザーはオフラインです)の場合は、ケース1を使用して、両方のケースを処理できます。それが正しいか、この流れ/プロセスがどのように働くかについての誤解がありますか?

+0

私たちにあなたがどのように「約束」機能を呼び出して使用するかを教えてください。違いは明らかであるはずです。 – Bergi

+0

実際に値の約束を即座に作成する適切な方法は 'return Q(" hi ");' – Bergi

答えて

0
  1. 約束は、あなたの仕事は非同期であり、$アヤックス()のような単純なケースのために
  2. をチェーン意味し、コールバック地獄に従事する人のためのものです。成功(callback1).fail(callback2が)約束のタイプです 3.your場合は非同期ではない、それはこのようなことかもしれません:Bで

var promise1 = function() { 
 
    //async get file name 
 
} 
 

 
var promise2 = function(filename) { 
 
    var defer = q.defer(); 
 
    var myData = "hi" 
 

 
    //async 
 
    fs.readFile(filename, 'utf-8', function(err, data) { 
 
     if (err) { 
 
     defer.reject(err); 
 
     } else { 
 
     defer.resolve(myData); 
 
     } 
 
    } 
 
    } 
 
    return d.promise; 
 
}; 
 
var promise3 = function(data) { 
 
    //use data do something 
 
} 
 

 
var onError(err) { 
 
    console.log(err); 
 
} 
 

 
var onDone(result) { 
 
    console.log(result) 
 
} 
 

 
//your logic might look like 
 
promise1.then(promise2).then(promise3).catch(onError).done(onDone);

1

あなたが最初のケースで約束でそれをラップしている間に、即座に知られているか計算されている結果を返す場合です。これを行うかどうかは、結果が非​​同期的に計算されるかどうかにかかわらず、関数の呼び出し側にとって透過的かどうかによって異なります。約束を返せば、後で関数の実装を自由に変更して、結果を非同期に計算または取得することができます。

つのヒント:あなたはとてもあなたの関数promiseを呼び出していないケース2に約束を使用していない

  1. 最初のケースでは、リテラルを約束するためにただreturn q("hi");にすることができます。
関連する問題