JavaScript中的承诺不能执行属性

时间:2017-06-09 05:08:56

标签: javascript angularjs node.js

我有一系列步骤需要按顺序完成:

  1. 验证对象
  2. 使用Bing的图片搜索API
  3. 获取图片网址
  4. 将找到的网址添加到对象
  5. 发布帖子请求并发送对象
  6. 示例对象如下所示:

    `{
        options: [{
          text: 'Pizza',
          votes: 0,
          imageURL: ""
        }, {
          text: 'Hot Dog',
          votes: 0,
          imageURL: ""
        }]
      };`
    

    因为这个系列中的顺序,我使用promises来确保一切按照上面指定的顺序进行。到目前为止,我有:

    
    
      function validatePoll() {
        var isValid = true;
        for (var i = 0; i < $scope.poll.options.length; i++) {
          if (!$scope.poll.options[i].text) {
            isValid = false;
            break;
          }
        }
        return isValid;
      }
    
      let promiseURL = function(searchTerm) {
        return new Promise(function(resolve, reject) {
          $http.get('https://api.cognitive.microsoft.com/bing/v5.0/images/search?q=' + searchTerm + '&count=1&offset=0&mkt=en-us&safeSearch=Strict', {
            headers: {
              'Ocp-Apim-Subscription-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXX'
            }
          }).success(function(response) {
            console.log(response);
            resolve(response);
          }).error(function (err, status) {
            reject(err);
          })
        })
      };
    
      let fetchImageURL = function() {
        for(var i = 0; i < $scope.poll.options.length; i++) {
          console.log(promiseURL($scope.poll.options[i].text));
        }
      }
    
      $scope.submitChoice = function() {
        var isValid = validatePoll();
        if(isValid) {
          fetchImageURL();
        } else {
          console.log("Not Valid Poll");
        }
      }
    &#13;
    &#13;
    &#13;

    但最终发生的是 console.log(promiseURL($ scope.poll.options [i] .text)); fetchImageURL中的返回未解析的promise而不是响应字符串I想改为。我怎样才能修复代码以确保:

    1. 使用正确的参数
    2. 调用promiseURL
    3. 收到回复并可以解析
    4. 可以将已解析的信息添加到民意调查对象
    5. 中的imageURL属性中

2 个答案:

答案 0 :(得分:3)

你看到了Promise的打印输出,因为你打印出了承诺。您需要处理承诺解决/拒绝。你应该叫什么:

promiseURL($scope.poll.options[i].text)
   .then(function(data){
      console.log("Success",data)
   })
   .catch(function(error){
      console.log("Error",error")
   })

答案 1 :(得分:0)

承诺通常如下使用:

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

promise本身的位置:

var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything turned out fine */) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});

在您的循环中,您在then上呼叫promiseURL($scope.poll.options[i].text)并不是一回事。尝试做类似的事情:

for(var i = 0; i < $scope.poll.options.length; i++) {
  promiseURL($scope.poll.options[i].text).then(function(result) {
      console.log(result); // "Stuff worked!"
  });
}

请参阅https://developers.google.com/web/fundamentals/getting-started/primers/promises以获取有关承诺的精彩入门。