我想使用这样的Promise来调用Google Maps Geocoding API:
function makeGeoCodingRequest(address,bounds)
{
/*
Input parameters:
address:a string
bounds: an object of class google.maps.LatLngBounds(southWest,northEast)
This will return a set of locations from the google geocoding library for the given query
*/
var url="https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=AIzaSyD9GBloPC20X-1kWRo7sm_0z5xvCiaSd3c";
var promise,response;
var messages={
"ZERO_RESULTS":"No results were found",
"OVER_QUERY_LIMIT":"We are over the query limit.Wait awhile before making a request",
"REQUEST_DENIED":"Request was denied,probably using a bad or expired API Key",
"INVALID_REQUEST":"Request was sent without the required address,component or component",
"UNKNOWN_ERROR": "There was an error somewhere on Google's servers"
};
if(address)
promise=Q($.ajax({
type: "GET",
url: "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=API_KEY"
}));
return promise.then(function(data) {
if (data.status === "OK") return data;
else console.error(messages[data.status]);
return null;
});
}
当我调用函数makeGeoCodingRequest
请求时,我发现我得到了一个Promise而不是一个值:
var geo=makeGeoCodingRequest(address);
console.log(Q.isPromise(geo));//returns true
为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值?
如果您依赖承诺来返回数据,则必须从函数中返回承诺。
一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步=返回承诺)
请注意,您的if
语句没有花括号,因此,如果条件失败,则仅不会执行后面的第一条语句。
我在此示例中对其进行了修复。请注意我添加的备注。
if(address){
promise=Q($.ajax({
type: "GET",
url: "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=API_KEY"
}));
return promise.then(function(data) {
// whatever you return here will also become the resolve value of the promise returned by makeGeoCodingRequest
// If you don't want to validate the data, you can in fact just return the promise variable directly
// you probably want to return a rejected promise here if status is not what you expected
if (data.status === "OK") return data;
else console.error(messages[data.status]);
return null;
});
}
您必须makeGeoCodingRequest
以以下方式致电。
makeGeoCodingRequest(address,bounds).then(function(data){
// this will contain whatever
console.log(data);
});
问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,
问题内容: 我正在尝试编写一个函数(使用WebdriverJS lib),该函数遍历元素列表,检查名称并构建与该名称相对应的xpath定位器。我在这里简化了xpath定位器,所以不用注意。 我在这里面临的问题是:1)调用此函数返回未定义。据我了解,这是因为return语句不在其位置,而是:2)将其放置在同步代码通常可以正常工作的正确位置,不适用于异步承诺,因此调用此函数将返回相同的未定义,但是因为
#1处的console.log生成正确的数据。console.log#2始终生成“a”; 如有任何指示,将不胜感激。
问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相
我正在尝试用Akka / Scala编写一个actor,调用HTTP REST API并将结果发送回调用actor。API 可能会返回结果的集合/向量,必须首先将其转换为内部供应商中性格式,以便将来可以更改供应商,而无需对代码进行太多更改。大多数代码都在工作,但我不知道如何解压缩并发送内部向量。 这是我拥有的代码,它向调用的Actor返回一个。我想返回的是最终操作中创建的实际向量: 主叫演员: 如
我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?