2016-11-06 8 views
-1

私は、約束事の概念だけでなく、一般的なJavaScriptにも慣れています。私はNode.jsに結果を約束するURLを渡すことができる関数を書くことを試みています。return new Promise()がNode.jsで動作しない

私は2つの方法でプログラムしました。最初の関数は機能しません。関数にURLを渡すことができます。 URLが静的に定義されている2番目のメソッドが機能します。コンパイラーは何らかの理由で私が理解できない関数だとは思わないので、最初の関数は機能しません、なぜですか?

機能getJson、関数としてノードによって解釈されないようTHIS WAYは動作しません:

var options = { method: 'GET', 
       url: URL, // This will be dynamically filled by the argument to the function getJson 
       headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } }; 

var getJson = function(URL){ 

    return new Promise(function(resolve, reject) { 

    request(options, function (error, response, body) { 
     if(error) reject(error); 
     else { 
     resolve(JSON.parse(body)); //The body has an array in the jason called Items 
     } 
    }); 
    }); // Edited original post. Had two curly braces }}; here by accident, which was why function was not being recognized 
}; 

getJson.then(function(result) { 
    console.log(result.Items); // "Stuff worked!" 
}, function(err) { 
    console.log(err); // Error: "It broke" 
}); 

THIS WAYが作業を行い、私はBACKコンソールに項目の配列を取得します。これの欠点は、使用されるURLが静的であることです。私がしようとしていることのポイントは、APIの結果を取得することによって一連のURLを連鎖させることです.1つのURL呼び出しには結果のNextPageのURLが含まれています。あなたの最初のコードブロック内

var options = { method: 'GET', 
    url: 'http://staticURL', 
    headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } }; 

var getJson = new Promise(function(resolve, reject) { 
    request(options, function(err, response, body) { 
    if(err) reject(err); 
    else { 
     resolve(JSON.parse(body)); 
    } 
    }); 
}); 

getJson.then(function(result) { 
    console.log(result.Items); // "Stuff worked!" 
}, function(err) { 
    console.log(err); // Error: "It broke" 
}); 

答えて

2

これを試してみてください

getJson(theDynamicURLGoesHere).then(function(result) { 
    console.log(result.Items); // "Stuff worked!" 
}, function(err) { 
    console.log(err); // Error: "It broke" 
}); 
+0

ありがとうございます。私は関数内にオプションを置くことを考えていましたが、関数が定義される前に宣言する必要があるかどうかは不明でした。あなたがここに置いたものは、私の元の問題だった一つの変更で動作します。私は愚かに2つ目の右中括弧を持っていたので、それは認識されていなかったのです。私はそれを}に変更しました。それはあなたの電話を使用するとき働いた。再度、感謝します – DAB

2
getJson.then(...) 

正しくありません。あなたはそれを実行するためにそれを呼び出す必要があり、あなたがそれを必要な引数を渡す必要があるので、その最初のコードブロックでは、getJsonが関数であるため、

getJson(someURL).then(...) 

:それはする必要があります。あなたの最初のコードブロックで


getJsonはあなたが約束を得るために関数を呼び出す必要がありますので、あなたが関数を呼び出して実行する約束を返す関数です。 2番目のコードブロックでは、getJsonは既に約束されているので、getJson.then(...)と呼ぶことができます。

var getJson = function(URL){ 
    var options = { 
    method: 'GET', 
    url: URL, 
    headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } 
    }; 
    return new Promise(function(resolve, reject) { 

    request(options, function (error, response, body) { 
     if(error) reject(error); 
     else { 
     resolve(JSON.parse(body)); 
     } 
    }); 
    }}; 
}; 

をそしてあなたはそれを呼び出すことができます:

+0

感謝をそんなに。あなたが2つの違いを説明した方法(最初のものは約束を返す関数、2番目は約束)は私にとって完璧な意味を持ち、多くの事をクリアします。私は愚かに2つ目の右中括弧を持っていたので、それは認識されていなかったのです。私はそれを}に変更しました。それはあなたの電話を使用するとき働いた。もう一度ありがとう – DAB

関連する問題