据我所知,promise是可以解决()或拒绝()但我很惊讶发现在调用解析或拒绝后,promise中的代码继续执行.
我认为解决或拒绝是退出或返回的异步友好版本,这将停止所有立即执行功能.
有人可以解释为什么以下示例有时会在解析调用后显示console.log的想法:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
Run Code Online (Sandbox Code Playgroud)
我试图了解如何调试基于promises的异步代码.By Promises我的意思是基于ECMAScript 6的承诺,通过调试我的意思是使用内置的chrome或firefox调试器.
我遇到的问题是 - 当发生错误时,无论我如何拒绝它,我都无法获得堆栈跟踪.
我试过这些:
console.log(new Error('Error occured'));
throw new Error('Throwing an Error');
return new Error('Error returned by the onRejected function');
reject(new Error('Pass Error to the reject function'));
Run Code Online (Sandbox Code Playgroud)
但是这些都不会返回代码中的实际错误或堆栈跟踪.
所以我的问题是 - 如何正确调试javascript Promises?
我有一些代码在一个列表中进行迭代,该列表从数据库中查询并为该列表中的每个元素发出HTTP请求.该列表有时可能是一个相当大的数字(成千上万),我想确保我没有遇到数千个并发HTTP请求的Web服务器.
此代码的缩写版本目前看起来像这样......
function getCounts() {
return users.map(user => {
return new Promise(resolve => {
remoteServer.getCount(user) // makes an HTTP request
.then(() => {
/* snip */
resolve();
});
});
});
}
Promise.all(getCounts()).then(() => { /* snip */});
Run Code Online (Sandbox Code Playgroud)
此代码在Node 4.3.2上运行.重申Promise.all
一下,可以进行管理,以便在任何给定时间只有一定数量的Promise正在进行中?
在使用rxjs的Angular 2中,我试图将Promise转换为Observable.由于许多在线指南的显示我用fromPromise
的Observable
.哪个抛出错误:
Property 'fromPromise' does not exist on type 'typeof Observable'.
Run Code Online (Sandbox Code Playgroud)
Observable导入如下:
import { Observable } from "rxjs/Observable";
Run Code Online (Sandbox Code Playgroud)
尝试fromPromise
像其他运算符一样导入会导致错误:
import 'rxjs/add/operator/fromPromise';
Run Code Online (Sandbox Code Playgroud)
即使我压制打字稿错误,它仍然会导致错误:
(<any>Observable).fromPromise
Run Code Online (Sandbox Code Playgroud)
错误:
Uncaught (in promise): TypeError: __WEBPACK_IMPORTED_MODULE_3_rxjs_Observable__.Observable.fromPromise is not a function
Run Code Online (Sandbox Code Playgroud)
rxjs repo 在这里报告了一些类似的问题,但也没有解决方案.
使用ES6承诺,如何在不定义解析逻辑的情况下创建承诺?这是一个基本的例子(一些TypeScript):
var promises = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return promises[key];
}
var promise = new Promise(resolve => {
// But I don't want to try resolving anything here :(
});
promises[key] = promise;
return promise;
}
function resolveWith(key: string, value: any): void {
promises[key].resolve(value); // Not valid :(
}
Run Code Online (Sandbox Code Playgroud)
使用其他promise库可以轻松完成.以JQuery为例:
var deferreds = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return deferreds[key].promise();
}
var def = $.Deferred();
deferreds[key] = …
Run Code Online (Sandbox Code Playgroud) 我有以下功能,试图使用Promises.
var getDefinitions = function() {
return new Promise(function(resolve) {
resolve(ContactManager.request("definition:entities"));
});
}
var definitions = getDefinitions()
Run Code Online (Sandbox Code Playgroud)
definitions
正在回归:
Promise {
[[PromiseStatus]]: "resolved",
[[PromiseValue]]: child
}
Run Code Online (Sandbox Code Playgroud)
我想获得PromiseValue的价值,但要求
var value = definitions.PromiseValue; // undefined
Run Code Online (Sandbox Code Playgroud)
给了我一个不确定的结果.
我的问题是双括号是什么PromiseValue
意思,我该如何检索它的值[[ ]]
.
我有一个HTTP API,它在成功和失败时返回JSON数据.
示例失败将如下所示:
~ ? http get http://localhost:5000/api/isbn/2266202022
HTTP/1.1 400 BAD REQUEST
Content-Length: 171
Content-Type: application/json
Server: TornadoServer/4.0
{
"message": "There was an issue with at least some of the supplied values.",
"payload": {
"isbn": "Could not find match for ISBN."
},
"type": "validation"
}
Run Code Online (Sandbox Code Playgroud)
我想在JavaScript代码中实现的是这样的:
fetch(url)
.then((resp) => {
if (resp.status >= 200 && resp.status < 300) {
return resp.json();
} else {
// This does not work, since the Promise returned by `json()` is never fulfilled
return Promise.reject(resp.json()); …
Run Code Online (Sandbox Code Playgroud) 作为一种组织模式,ES6类可以为异步代码提供什么.下面是ES7 async/await的示例,ES6类可以在ES7中使用异步方法或构造函数吗?
我可不可以做:
class Foo {
async constructor() {
let res = await getHTML();
this.res = res
}
}
Run Code Online (Sandbox Code Playgroud)
而且,如果不是,构造函数应如何工作呢?
class Foo {
constructor() {
getHTML().then( function (res) {
this.res = res
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果这些模式都不起作用,那么ES6中的构造函数(以及类)是否class
支持对对象状态进行操作的任何形式的异步性?或者,它们仅用于纯粹的同步代码库吗?上面的例子在构造函数中,但它们不需要是......将问题再推下一级......
class Foo {
myMethod () {
/* Can I do anything async here */
}
}
Run Code Online (Sandbox Code Playgroud)
或者,用吸气剂......
class Foo {
get myProp() {
/* Is there any case that this is usefully asynchronous */
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一例子是在同一个方法/构造函数/ getter中并行运行某些东西,但是要在结束之前解决整个问题.我只是感到困惑,因为它似乎完全异步库的所有推动,这只是混淆事情.除了教科书示例,我找不到一个他们有用的应用程序.
关于这两个很重要的来源:NZakas - 承诺链中的承诺和MDN承诺,我想问以下问题:
每次我们从promise履行处理程序返回一个值时,该值是如何传递给从同一个处理程序返回的新promise?
例如,
let p1 = new Promise(function(resolve, reject) {
resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
resolve(43);
});
let p3 = p1.then(function(value) {
// first fulfillment handler
console.log(value); // 42
return p2;
});
p3.then(function(value) {
// second fulfillment handler
console.log(value); // 43
});
Run Code Online (Sandbox Code Playgroud)
在这个例子中,p2
是一个承诺.p3
也是源于p1
履行处理者的承诺.但是p2 !== p3
.相反,p2
不知何故神奇地解决43
(如何?),然后将该值传递给p3
履行处理程序.即使是这里的句子也令人困惑.
你能否向我解释一下究竟发生了什么?我对这个概念感到困惑.
我有一个场景,我将返回一个承诺.承诺基本上给出了ajax请求的响应.
在拒绝承诺时,它显示错误对话框,表明存在服务器错误.
我想要做的是当响应代码是401时,我既不想解决承诺也不想拒绝它(因为它显示错误对话框).我想简单地重定向到登录页面.
我的代码看起来像这样
function makeRequest(ur,params) {
return new Promise(function(resolve,reject) {
fetch(url,params)
.then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
})
}
else {
if(status === 401) {
redirectToLoginPage();
}
else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({status,error});
})
}
}
})
});
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的状态是401,我正在重定向到登录页面.承诺既未得到解决也未被拒绝.
这段代码好吗?或者有更好的方法来实现这一目标.
谢谢.
es6-promise ×10
javascript ×8
promise ×7
ecmascript-6 ×3
node.js ×2
angular ×1
asynchronous ×1
es6-class ×1
fetch-api ×1
observable ×1
rxjs ×1