如何兑现我的诺言-获取未返回期望的结果

时间:2019-12-27 03:12:34

标签: javascript asynchronous

获取承诺不适用于我

在使用Javascript Promises时,我是一个新手。在我当前的项目中,我相信Promises是我要完成的任务的候选人。该项目很简单,它是一种在线表单,可以向客户提交报价(或估价)。

我正在处理显示已提交报价的页面-(view-quote.html)

任务分解如下:

  • 给出一个quote_id(URL参数),我想查询QUOTES表。
  • 在这些结果中是一个客户ID。
  • 最后,我想使用quote_id查询ITEMS表。

同步还是异步?

由于一个查询依赖于另一个查询,我以为我可以使用Fetch语句,该语句“可以”。

我认为我应该使用异步代码来完成此任务,对吗?我不确定。也许我需要传统的“回调”?

我当前的无效代码...

据我所知。我通过遵循我在Stack网站上找到的提示和教程将它们拼凑而成。

var getQuote = function() {
   fetch(apiQuoteUrl+"GL555")  // for testing, I hardcoded a quote num
  .then(status)
  .then(json)
  .then(function(data) {
    // WORKS - this DOES return me the client id
    //alert(data[0].client_id);
    gClient_id = data[0].client_id; // move to global var
  }).catch(function(error) {
    console.log('Request failed', error);
  });
};


// This function takes one parameter, the client id
// which comes from the fetch call above.
var getClient = function(clientId) {
   fetch()
  .then(status)
  .then(json)
  .then(function(data) {
      // TO BE DETERMINED, NOT SURE
      // WHAT TO PUT HERE

  }).catch(function(error) {
    console.log('Request failed', error);
  });
};

var getItems = function() {
   fetch()
  .then(status)
  .then(json)
  .then(function(data) {
      // TO BE DETERMINED, NOT SURE
      // WHAT TO PUT HERE
  }).catch(function(error) {
    console.log('Request failed', error);
  });
};



function status(response) {
  if (response.status >= 200 && response.status < 300) {
    return Promise.resolve(response)
  } else {
    return Promise.reject(new Error(response.statusText))
  }
}

function json(response) {
  return response.json()
}

下一步该怎么做?

好,我已经准备好框架。但是,我不知道继续。我已经按照Fetch and Promises上的数十个教程进行了学习,但是它们并不完全符合我的需求,因此,我还是一头雾水。

正确的路线?

因此,我现在感到担心的是,这使我变得比原来更难了。通过使用诺言,我是否还在正确的轨道上?

谢谢您的光临。非常感谢您的建议/代码帮助。

约翰

1 个答案:

答案 0 :(得分:1)

  

他们也不为我工作!

你好!我相信我最近遇到了与您相同的问题:“束缚承诺”

快速搜索带来了here,我得以解决自己的问题。

最基本的是,您需要从诺言中返回一个值以.then()

因此,对于fetch(),请尝试类似的操作

var getQuote = function() {
  fetch(apiQuoteUrl + "GL555")
    .then(status => return status.json())
    .then(data => {
      alert(data[0].client_id);
      gClient_id = data[0].client_id;
    }).catch(error => {
      console.log('Request failed', error);
    });
};