Javascript 使用jquery或不使用jquery的正确方法是什么?
没有angular或typescript,我有以下代码:Javascript 使用jquery或不使用jquery的正确方法是什么?,javascript,jquery,angular,Javascript,Jquery,Angular,没有angular或typescript,我有以下代码: let queue = [ function () { let waitingTime = 0 ; setTimeout(function () { console.log("a - " + Date.now()); }, waitingTime); }, function () { let waitingTime = 2500 ; setTimeout(function
let queue = [
function () {
let waitingTime = 0 ;
setTimeout(function () { console.log("a - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 2500 ;
setTimeout(function () { console.log("b - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 5000 ;
setTimeout(function () { console.log("c - " + Date.now()); }, waitingTime); }
];
function SerialCall(queue) {
var d = $.Deferred().resolve();
while (queue.length > 0) {
d = d.then(queue.shift()); // you don't need the `.done`
}
}
SerialCall(queue);
我想在一个组件内的angular8和typesript中复制它。
我尝试了npm安装jquery和npm I@types/jquery。
我看到“d=d”行出现以下错误:
(本地变量)d:JQuery.Deferred
类型“PromiseBase”缺少类型“Deferred”中的以下属性:notify、notifyWith、reject、rejectWith和另外2个。ts(2740)
做我想做的事的正确方法是什么?(执行队列中的第一个函数,完成后执行第二个,然后执行第三个)。如果有一种仅角度的/javascript方式更为优雅,如果有另一个标准库对此非常熟悉并适用于我正在尝试做的事情,则不必使用jquery,这是一个可接受的答案。您的示例可以使用该函数对可观察对象进行处理
const队列=[
延迟(()=>的(新日期()).pipe(延迟(0)),
延迟(()=>的(新日期())。管道(延迟(2500)),
延迟(()=>的(新日期())。管道(延迟(5000))
];
concat(…queue).subscribe(console.log);
concat函数按照完成的顺序从可观察对象中发出值
在角度上,可观察性是承诺的首选替代品,你基本上可以用承诺做你以前做过的任何事情,再加上更多
承诺在解析值时是基于拉的。在发出值时是基于推的。后者允许进行声明性编程,描述如何修改数据流
一些关于可观测数据的教程:
如果您正在寻找一种使用承诺的方法(如标题所示),那么您可以执行以下操作:
// Let's stick to your original functions array
const queue = [
function () {
let waitingTime = 0 ;
setTimeout(function () { console.log("a - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 2500 ;
setTimeout(function () { console.log("b - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 5000 ;
setTimeout(function () { console.log("c - " + Date.now()); }, waitingTime); }
];
// you'll need this for the .reduce call
const starterPromise = Promise.resolve(null);
// Our Async wrapper
function asyncRunner(fn) {
return (new Promise(resolve => { resolve(fn()) }));
}
// and finally the reducer
await queue.reduce(
(p, fn) => p.then(() => asyncRunner(fn)),
starterPromise
);
JavaScript是单线程的。因此
queue.map(x=>x())
也会有相同的结果。我怀疑您打算让队列中的函数返回承诺。是的,关键是我希望按顺序(一个接一个)执行每个函数但不是同时进行的。如果有比承诺更好的替代方案,我想知道。你没有,使用jQuery和Angular是有原因的。他们在一起玩得不好。学习RxJs。
// Let's stick to your original functions array
const queue = [
function () {
let waitingTime = 0 ;
setTimeout(function () { console.log("a - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 2500 ;
setTimeout(function () { console.log("b - " + Date.now()); }, waitingTime); },
function () {
let waitingTime = 5000 ;
setTimeout(function () { console.log("c - " + Date.now()); }, waitingTime); }
];
// you'll need this for the .reduce call
const starterPromise = Promise.resolve(null);
// Our Async wrapper
function asyncRunner(fn) {
return (new Promise(resolve => { resolve(fn()) }));
}
// and finally the reducer
await queue.reduce(
(p, fn) => p.then(() => asyncRunner(fn)),
starterPromise
);