是否有清除.then
JavaScript Promise
实例的方法?
我已经在QUnit之上编写了一个JavaScript测试框架。该框架通过在.NET中运行每个测试来同步运行测试Promise
。(很抱歉,此代码块的长度。我已尽我所能对其进行了评论,因此它不会那么乏味。)
/* Promise extension -- used for easily making an async step with a
timeout without the Promise knowing anything about the function
it's waiting on */
$$.extend(Promise, {
asyncTimeout: function (timeToLive, errorMessage) {
var error = new Error(errorMessage || "Operation timed out.");
var res, // resolve()
rej, // reject()
t, // timeout instance
rst, // reset timeout function
p, // the promise instance
at; // the returned asyncTimeout instance
function createTimeout(reject, tempTtl) {
return setTimeout(function () {
// triggers a timeout event on the asyncTimeout object so that,
// if we want, we can do stuff outside of a .catch() block
// (may not be needed?)
$$(at).trigger("timeout");
reject(error);
}, tempTtl || timeToLive);
}
p = new Promise(function (resolve, reject) {
if (timeToLive != -1) {
t = createTimeout(reject);
// reset function -- allows a one-time timeout different
// from the one original specified
rst = function (tempTtl) {
clearTimeout(t);
t = createTimeout(reject, tempTtl);
}
} else {
// timeToLive = -1 -- allow this promise to run indefinitely
// used while debugging
t = 0;
rst = function () { return; };
}
res = function () {
clearTimeout(t);
resolve();
};
rej = reject;
});
return at = {
promise: p,
resolve: res,
reject: rej,
reset: rst,
timeout: t
};
}
});
/* framework module members... */
test: function (name, fn, options) {
var mod = this; // local reference to framework module since promises
// run code under the window object
var defaultOptions = {
// default max running time is 5 seconds
timeout: 5000
}
options = $$.extend({}, defaultOptions, options);
// remove timeout when debugging is enabled
options.timeout = mod.debugging ? -1 : options.timeout;
// call to QUnit.test()
test(name, function (assert) {
// tell QUnit this is an async test so it doesn't run other tests
// until done() is called
var done = assert.async();
return new Promise(function (resolve, reject) {
console.log("Beginning: " + name);
var at = Promise.asyncTimeout(options.timeout, "Test timed out.");
$$(at).one("timeout", function () {
// assert.fail() is just an extension I made that literally calls
// assert.ok(false, msg);
assert.fail("Test timed out");
});
// run test function
var result = fn.call(mod, assert, at.reset);
// if the test returns a Promise, resolve it before resolving the test promise
if (result && result.constructor === Promise) {
// catch unhandled errors thrown by the test so future tests will run
result.catch(function (error) {
var msg = "Unhandled error occurred."
if (error) {
msg = error.message + "\n" + error.stack;
}
assert.fail(msg);
}).then(function () {
// resolve the timeout Promise
at.resolve();
resolve();
});
} else {
// if test does not return a Promise, simply clear the timeout
// and resolve our test Promise
at.resolve();
resolve();
}
}).then(function () {
// tell QUnit that the test is over so that it can clean up and start the next test
done();
console.log("Ending: " + name);
});
});
}
如果测试超时,我的超时Promise将会assert.fail()
在测试中进行测试,以便将测试标记为失败,这一切都很好,但是测试继续运行,因为测试Promise(result
)仍在等待解决它。
我需要取消考试的好方法。我可以通过在框架模块之类的地方创建一个字段this.cancelTest
,然后在测试中每隔一段时间(例如在每次then()
迭代的开始)检查是否取消来做到这一点。但是,理想情况下,我可以$$(at).on("timeout", /* something here */)
用来清除变量中的剩余then()
s result
,以便不运行其余所有测试。
是否存在这样的东西?
我尝试使用Promise.race([result, at.promise])
。没用
为了解除对我的限制,我mod.cancelTest
在测试思路中在/ polling上添加了几行。(我还删除了事件触发器。)
return new Promise(function (resolve, reject) {
console.log("Beginning: " + name);
var at = Promise.asyncTimeout(options.timeout, "Test timed out.");
at.promise.catch(function () {
// end the test if it times out
mod.cancelTest = true;
assert.fail("Test timed out");
resolve();
});
// ...
}).then(function () {
// tell QUnit that the test is over so that it can clean up and start the next test
done();
console.log("Ending: " + name);
});
我在catch
语句中设置了一个断点,并且该命中率很高。现在让我感到困惑的是,该then()
声明没有被调用。有想法吗?
想通了最后一件事。 fn.call()
抛出了一个我没有捕获的错误,因此测试承诺在at.promise.catch()
解决之前就被拒绝了。
是否有清除.then
JavaScript Promise实例的方法?
不。至少在ECMAScript 6中没有。then
默认情况下,不幸的是,承诺(及其处理程序)是无法取消的。关于es-
discuss有一些有关如何正确执行此操作的讨论,但是无论哪种方法获胜,都不会在ES6中实现。
当前的观点是,子类化将允许使用您自己的实现来创建可取消的Promise(不确定其效果如何) 。
在语言委托人找到最佳方法之前 (希望是ES7?), 您仍然可以使用userland Promise实现,其中许多功能都取消了。
请求地址 https://api.es.xiaojukeji.com/river/Approval/cancel 返回数据格式 JSON 请求类型 POST 请求参数 参数名称 数据类型 必选 说明 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access token timestamp string yes 当前
使用on()方法绑定事件后,若希望取消绑定,则可以使用off()方法。off()方法根据传入参数的不同,有不同的实现逻辑。 version added: 2.0.0 .off( event , selector , handler ) event Type: String 需取消绑定的事件名称,例如:'tap' selector Type: String 选择器 handler Type: Fun
说明 支付宝境外到店支付-取消订单 官方文档:https://global.alipay.com/service/external_QR_Code/19 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\Cancel\Request 属性 名称 类型 说明 $service string 接口名称 $timestamp int 商户服务
说明 取消叫车订单,行程中的订单不能取消(司机一旦点击开始计费,订单将不能取消) 司机应答后,乘客取消订单需要强制取消,请求参数时force=true(默认为false),否则会取消失败 请求地址 /v1/order/Cancel 支持格式 Json或普通form HTTP请求方式 Post 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述
问题内容: 我试图像这样使用PrintWriter: 但是Java抱怨: 无效不能取消引用 如果我做: 可行,有什么原因吗? 问题答案: 是。(和其他方法)的签名返回(不是)。您不能将调用链接到方法。
当我试图从struts的action类(即RMI客户端)访问RMI serevr时(点击jsp按钮),我得到了这个执行选项 下面是我的RMI客户端代码片段 当我使用public static void main()在单独的文件中尝试上面的代码时,这很好,但当我在struts框架的Action类中尝试相同的代码时,出现了上述异常。