Javascript 具有搜索功能

Javascript 具有搜索功能,javascript,promise,Javascript,Promise,我有一个对象数组,有一个按名称搜索一本书的函数,我想通过promises使用搜索函数,搜索成功后,应该执行convert函数。当我这样做时,我得到一个空数组 let book1 = { name: "wind", author: 'smith', size: 314, }; let book2 = { name: "moon", author: 'wild', size: 421, }; let book3 = { name: "sun", author: 'ja

我有一个对象数组,有一个按名称搜索一本书的函数,我想通过promises使用搜索函数,搜索成功后,应该执行convert函数。当我这样做时,我得到一个空数组

let book1 = {
  name: "wind",
  author: 'smith',
  size: 314,
};
let book2 = {
  name: "moon",
  author: 'wild',
  size: 421,
};
let book3 = {
  name: "sun",
  author: 'jacob',
  size: 510,
};
let books1 = [book1, book2, book3];
let books = [];

function searchName(search) {
  return new Promise(function(resolve, reject) {
    books1 = books1.filter(function(elem) {
      elem.name.includes(search)
    })
  })
};

function convert() {
  return books = books1.map(item => item.name);
};
searchName("wind").then(convert);
console.log(books);

你以各种方式错误地使用承诺-

const books=//对不会重新分配的绑定使用const
[{name:“风”//如果您愿意,可以在数组中声明对象
作者:史密斯
searchBooks(e.target.value)//获取筛选过的书籍
.then(convert)//传递要转换的书籍,获取结果
.then(console.log,console.error)//然后记录结果或错误
)
  • book1.filter中添加return语句,以获得过滤后的数组
  • 调用解析承诺正文中调用
  • 如果未捕获被拒绝的承诺,则可以在承诺执行者的参数中省略拒绝回调
  • console.log(books)在您的示例末尾,日志总是返回一个空数组,因为Promise将在console.log之后执行。阅读微任务,这里有一个很好的解释
  • 请尝试以下代码:

        function searchName(search) {
          return new Promise(function (resolve) {
            books1 = books1.filter(function (elem) {
              return elem.name.includes(search);
            });
    
            if (books1.length) {
              resolve();
            }
          });
        }
    
        function convert() {
          books = books1.map(item => item.name);
    
          console.log(books);
    
          return books;
        }
    
        searchName('wind').then(convert);
    

    你的承诺永远不会解决或拒绝。而且它是在做一些同步的事情,因此将其作为承诺不会带来任何价值。在承诺中包装同步过程毫无意义(无论如何,99.9999%的时间)。