我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
我已经开发了几年的JavaScript,我根本不理解有关承诺的大惊小怪.
似乎我所做的只是改变:
api(function(result){
api2(function(result2){
api3(function(result3){
// do work
});
});
});
Run Code Online (Sandbox Code Playgroud)
无论如何,我可以使用像async这样的库,例如:
api().then(function(result){
api2().then(function(result2){
api3().then(function(result3){
// do work
});
});
});
Run Code Online (Sandbox Code Playgroud)
哪个代码更多,可读性更低.我没有在这里获得任何东西,它也不会突然神奇地"平坦".更不用说必须将事物转换为承诺.
那么,这里的承诺有什么大惊小怪?
看看MDN,看起来values传递给then()Promise.all 的回调包含了promises顺序的值.例如:
var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
console.log(results) // is [1, 2, 3, 4, 5] the guaranteed result?
});
Run Code Online (Sandbox Code Playgroud)
任何人都可以引用规范说明values应该在哪个顺序?
PS:运行这样的代码表明这似乎是真的,虽然这当然没有证据 - 它可能是巧合.
根据我的理解,有三种方法可以调用异步代码:
request.on("event", callback);fs.open(path, flags, mode, callback);我找到了一个承诺库https://github.com/kriszyp/node-promise,但我没有得到它.
有人可以解释一下什么是承诺,为什么我应该使用它?
另外,为什么它从Node.js中删除了?
我最近一直在学习函数式编程(特别是Haskell,但我也经历过关于Lisp和Erlang的教程).虽然我发现这些概念非常具有启发性,但我仍然没有看到"无副作用"概念的实际方面.它有什么实际优势?我试图在功能思维中思考,但是有些情况看起来过于复杂而没有能够以简单的方式保存状态(我不认为Haskell的monad'容易').
是否值得继续深入学习Haskell(或其他纯函数式语言)?功能性或无状态编程实际上是否比程序性更高效?我以后可能继续使用Haskell或其他功能语言,还是应该仅仅为了理解而学习它?
我更关心性能而不是生产力.所以我主要问的是我是否会在函数式语言中比在程序/面向对象/其他方面更高效.
在这里,我试图围绕promises.Here在第一次请求我获取一组链接.并在下一个请求我获取第一个链接的内容.但我想在返回下一个promise对象之前做一个延迟.所以我使用它上面有setTimeout.但是它给了我以下JSON错误(without setTimeout() it works just fine)
SyntaxError:JSON.parse:JSON数据的第1行第1列的意外字符
我想知道为什么会失败?
let globalObj={};
function getLinks(url){
return new Promise(function(resolve,reject){
let http = new XMLHttpRequest();
http.onreadystatechange = function(){
if(http.readyState == 4){
if(http.status == 200){
resolve(http.response);
}else{
reject(new Error());
}
}
}
http.open("GET",url,true);
http.send();
});
}
getLinks('links.txt').then(function(links){
let all_links = (JSON.parse(links));
globalObj=all_links;
return getLinks(globalObj["one"]+".txt");
}).then(function(topic){
writeToBody(topic);
setTimeout(function(){
return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
},1000);
});
Run Code Online (Sandbox Code Playgroud) 我最近一直在搞乱fetch()api,并注意到一些有点古怪的东西.
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => {
return {
data: response.json(),
status: response.status
}
})
.then(post => document.write(post.data));
;
Run Code Online (Sandbox Code Playgroud)
post.data返回一个promise对象. http://jsbin.com/wofulo/2/edit?js,output
但是如果写成:
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
Run Code Online (Sandbox Code Playgroud)
post这里是一个标准对象,您可以访问title属性. http://jsbin.com/wofulo/edit?js,output
所以我的问题是:为什么response.json在对象文字中返回一个promise,但是如果刚刚返回则返回值?
我最近遇到过几次某种情况,我不知道如何正确解决.假设以下代码:
somethingAsync()
.then( afterSomething )
.then( afterSomethingElse )
function afterSomething( amazingData ) {
return processAsync( amazingData );
}
function afterSomethingElse( processedData ) {
}
Run Code Online (Sandbox Code Playgroud)
现在可能会出现我想要访问的amazingData情况afterSomethingElse.
一个明显的解决方案是返回一个数组或一个哈希afterSomething,因为,你只能从一个函数返回一个值.但我想知道是否有办法afterSomethingElse接受2个参数并同样调用它,因为这似乎更容易记录和理解.
我只是想知道这种可能性,因为它有Q.spread类似于我想要的东西.
我正在使用bluebird库,需要发出一系列HTTP请求,并需要将一些响应数据发送到下一个HTTP请求.我已经构建了一个处理我的请求的函数callhttp().这需要一个URL和POST的正文.
我这样称呼它:
var payload = '{"Username": "joe", "Password": "password"}';
var join = Promise.join;
join(
callhttp("172.16.28.200", payload),
callhttp("172.16.28.200", payload),
callhttp("172.16.28.200", payload),
function (first, second, third) {
console.log([first, second, third]);
});
Run Code Online (Sandbox Code Playgroud)
第一个请求获取一个API密钥,需要将其传递给第二个请求,依此类推.如何从第一个请求获取响应数据?
UPDATE
这是callhttp功能:
var Promise = require("bluebird");
var Request = Promise.promisify(require('request'));
function callhttp(host, body) {
var options = {
url: 'https://' + host + '/api/authorize',
method: "POST",
headers: {
'content-type': 'application/json'
},
body: body,
strictSSL: false
};
return Request(options).spread(function (response) {
if (response.statusCode == 200) {
// …Run Code Online (Sandbox Code Playgroud) 使用async/await和.then().catch()一起使用是否有任何危害,例如:
async apiCall(params) {
var results = await this.anotherCall()
.then(results => {
//do any results transformations
return results;
})
.catch(error => {
//handle any errors here
});
return results;
}
Run Code Online (Sandbox Code Playgroud) javascript ×9
promise ×8
bluebird ×3
node.js ×3
q ×3
asynchronous ×2
es6-promise ×2
async-await ×1
callback ×1
fetch-api ×1
immutability ×1
json ×1
state ×1