我如何使用promise等待异步地理编码方法返回结果然后返回true或false?
function LocationValidator(value, element, paras) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': value }, function (results, status) { // called asynchronously
if (status == google.maps.GeocoderStatus.OK) {
return true;
} else {
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud) 代码可以简化为类似的东西,
function start(callback) {
one.on('ready', () => {
console.log('one server ready');
});
two.on('ready', () => {
console.log('two connection ready');
});
one.connect();
two.start();
}
Run Code Online (Sandbox Code Playgroud)
callback在两个服务进入就绪状态后,我需要调用它.什么是最好的模式?
更新:欢迎使用RxJS如何做到这一点:)
我正在尝试重构一些节点代码,这些代码是一堆乱七八糟的回调.我认为为了这个目的,尝试承诺会很好.我正在尝试使用xml2js节点模块将一些xml字符串转换为json .原始代码是:
"use strict";
var xml2jsParser = require('xml2js').parseString;
var string = "<container><tag3>option3</tag3></container>";
xml2jsParser(string, function(err, result)
{
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
这显示:
{ container: { tag1: [ 'option1' ], tag2: [ 'option2' ], tag3: [ 'option3' ] } }
Run Code Online (Sandbox Code Playgroud)
关于这个问题的第一个答案如何将现有的回调API转换为承诺?我尝试使用promises以下列方式包装xml2jsParser函数:
"use strict";
var xml2jsParser = require('xml2js').parseString;
function promisesParser(string)
{
return new Promise(function(resolve, reject)
{
xml2jsParser(string, resolve);
});
}
var string = "<container><tag3>option3</tag3></container>";
promisesParser(string).then(function(err, result){
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
这将undefined通过控制台显示,而不是按预期显示在json对象上.我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情.我知道使用Bluebird promisify功能可以实现类似的功能,但我想在没有任何第三方库的情况下在普通的Javascript上执行此操作.
我坚持使用promise链,我需要在将图像上传到服务器后继续执行一些代码.它是Angular2和Typescript.让我们写一些伪代码:
uploadImages(images):Promise<any> {
return new Promise((resolve, reject) => {
for (let image of images) {
upload(image.type_1).on('upload_completed', (data) => {
// do something
})
upload(image.type_2).on('upload_completed', (data) => {
// do something
})
}
}
uploadImages(images).then(doSomethingElse);
Run Code Online (Sandbox Code Playgroud)
我以某种方式完成了这项任务,但我对承诺链有点困惑,我无法弄清楚如何在foreach循环中链接这个图像上传,并在所有上传时将结果返回到新的承诺中完成.这样做的正确方法是什么?
编辑:循环中有基于事件的回调,如何使用Promise.all()转换为promises它们?
我使用有api的javascript库.
libapi.callnetwork(arg1,callback(data){
//handle data
}
Run Code Online (Sandbox Code Playgroud)
然后我创建服务函数来像这样调用api
myFunction():Promise<any>{
libapi.callnetwork(arg1,callback(data){
return new Promise(resolve=>resolve(data));
})
}
Run Code Online (Sandbox Code Playgroud)
myFunction将收到错误,因为它必须返回promise或声明为void.如何创建从此API返回承诺的函数?
当我收到服务器响应时如何获取这个值?
当我运行它时,终端没有输出任何信息。
console.log(a);
function findMaxID() {
var a = needle.get(URL, function(err, res){
if (err) throw err;
return 222;
});
return a;
}Run Code Online (Sandbox Code Playgroud)
我正在使用JSZip解压缩运行异步的目录.我想编写一个解压缩文件并返回与之关联的文件的函数,如下所示:
function unzipFile(filename){
const zipper = new jsZip()
return fs.readFile(filename, function(err, data) {
return jsZip.loadAsync(data).then(function(zip) {
return zip.files
})
})
}
Run Code Online (Sandbox Code Playgroud)
但这只是回归undefined.我如何使这个异步,以便它在单个函数中返回解压缩的目录,如果我想设置一个等于其输出的变量将等待它的完成?
Web应用程序页面包含两个大组件,它们在完全呈现时会调用回调.
问题是在两个组件完全呈现后调用函数.
这可以通过使用超时和轮询一些变量来解决,但我想应该有更好的方法.
让我们说,我有这样的:
function callMeAfterBothRendered() {...};
libA = libraryA($('.comp1'), {"rendered": function () {...}});
libB = libraryB($('.comp2'), {"rendered": function () {...}});
Run Code Online (Sandbox Code Playgroud)
我已经找到了链接承诺的一些材料,但不太确定如何应用于这种情况?
一个复杂的问题是,实际上这些库不是直接在同一个地方调用的(如上面简单示出的),而是在适配器"类"中更深层次的一些初始化方法中.
什么可以是这个的好解决方案,也可以很容易地推广到3个组件?
我正在创建一个带有 Lambda 函数的 Excel 文件,该文件稍后通过电子邮件发送。Excel之前填充数据,然后像这样存储(使用excel4node nom包):
console.log("Before print");
var test2 = await workbook.write(path, function(err, stats) {
console.log("Excel written");
if (err) {
console.error(err);
} else {
console.log(stats); // Prints out an instance of a node.js fs.Stats object
}
});
console.log("After print");
Run Code Online (Sandbox Code Playgroud)
该代码有时有效。问题是下面的代码没有等到写好excel并且电子邮件找不到附件。
如何让我的 Lambda 函数等到 excel 写入磁盘?
我正在探索 Promise.all() 的使用,但我不知道为什么它没有给我预期的结果。我尝试一步一步地说明它。
让我们看一下我的代码:
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'foo');
});
var apiCall = async () =>{
// to simulate a api call that will response after 5 sec
setTimeout(() => {return 1000}, 5000);
}
Promise.all([p2,p3,apiCall()]).then(values => {
console.log(values); // [3, 1337, undefine], but I expect [3, 1337, 1000]
});
apiCall().then((response)=>{console.log(response)})
Run Code Online (Sandbox Code Playgroud)
据我了解,async 函数会立即返回一个 Promise,这就是 Promise.all 会等待的。
所以我期望,
.then(values => {
console.log(values); // [3, 1337, undefined]
});
Run Code Online (Sandbox Code Playgroud)
5秒后才会执行。
但 2 秒后的输出已经如下所示,而不是 [3, …
我希望返回一个稍后自行解决的 Promise,但似乎我的语法无效,我很好奇什么是更好的实现。为什么 Promise 构造函数需要执行器?
promise = new Promise()无效,因为我需要提供一个函数
function getDetails (someHash) {
var url = "http://somewebsite.com/" + someHash,
promise = new Promise();
makeAjaxRequest(url, function (response) {
promise.resolve(response.data);
});
setTimeout(function () {
promise.reject("timeout");
}, 500);
return promise;
}
function makeAjaxRequest (url, callback) {
var someResponse = {data: "some data"};
setTimeout(function () {
callback(someResponse);
}, 200);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这个功能?
我想获取RSVP全局对象,并将其包装到我的全局应用程序闭包内的闭包中,以便我可以按照我想要的方式调用它.它还使我更容易记住如何使用它,以后在开发中.
所以给定RSVP的这个标准用法:
new RSVP.Promise(function(resolve, reject) {
// succeed
resolve(value);
// or reject
reject(error);
});
Run Code Online (Sandbox Code Playgroud)
如何使用您在下面看到的设计模式为此创建包装器?我想把这个RSVP对象放到包装器中,这样我就不必每次都在同一个地方实例化一个新的RSVP Promise并定义我的回调.
我希望var newPromise = app.core.promise(callback)每次想要做出新的承诺时都会打电话.
我怎样才能将它包装成一个闭包以便可能?这是我到目前为止 - 正确的方法是什么?
app.core.promise = function (resolveFunc, paramObj) {
if(typeof(resolveFunc) === 'function'){
//lets move on shall we?
return new window.RSVP.Promise(function(resolveFunc, reject){
//so this is the real question, what am i to do here?
if(paramObj){
//do something with this object first, or just run it, depending on your use case
//paramObj = chopBalls(paramObj);
resolveFunc(paramObj); …Run Code Online (Sandbox Code Playgroud) javascript ×9
promise ×7
node.js ×4
asynchronous ×3
angular ×2
es6-promise ×2
typescript ×2
asp.net-mvc ×1
async-await ×1
async.js ×1
callback ×1
deferred ×1
json ×1
needle.js ×1
rsvp.js ×1
rxjs ×1