Javascript 使用jquery或不使用jquery的正确方法是什么?

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

没有angular或typescript,我有以下代码:

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
);