Xử lý lỗi trong Promise.all

296
Jon 2015-05-21 14:46.

Tôi có một loạt các Lời hứa mà tôi đang giải quyết Promise.all(arrayOfPromises);

Tôi tiếp tục để tiếp tục chuỗi lời hứa. Trông giống như thế này

existingPromiseChain = existingPromiseChain.then(function() {
  var arrayOfPromises = state.routes.map(function(route){
    return route.handler.promiseHandler();
  });
  return Promise.all(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
  // do stuff with my array of resolved promises, eventually ending with a res.send();
});

Tôi muốn thêm một câu lệnh bắt để xử lý một lời hứa riêng lẻ trong trường hợp nó bị lỗi, nhưng khi tôi thử, Promise.alltrả về lỗi đầu tiên mà nó tìm thấy (bỏ qua phần còn lại) và sau đó tôi không thể lấy dữ liệu từ phần còn lại của các lời hứa trong mảng (không bị lỗi).

Tôi đã thử làm điều gì đó như ..

existingPromiseChain = existingPromiseChain.then(function() {
      var arrayOfPromises = state.routes.map(function(route){
        return route.handler.promiseHandler()
          .then(function(data) {
             return data;
          })
          .catch(function(err) {
             return err
          });
      });
      return Promise.all(arrayOfPromises)
    });

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
      // do stuff with my array of resolved promises, eventually ending with a res.send();
});

Nhưng điều đó không giải quyết được.

Cảm ơn!

-

Biên tập:

Những gì các câu trả lời dưới đây nói là hoàn toàn đúng sự thật, mã bị phá vỡ do các lý do khác. Trong trường hợp có ai quan tâm, đây là giải pháp mà tôi đã kết thúc với ...

Chuỗi máy chủ Node Express

serverSidePromiseChain
    .then(function(AppRouter) {
        var arrayOfPromises = state.routes.map(function(route) {
            return route.async();
        });
        Promise.all(arrayOfPromises)
            .catch(function(err) {
                // log that I have an error, return the entire array;
                console.log('A promise failed to resolve', err);
                return arrayOfPromises;
            })
            .then(function(arrayOfPromises) {
                // full array of resolved promises;
            })
    };

Cuộc gọi API (cuộc gọi route.async)

return async()
    .then(function(result) {
        // dispatch a success
        return result;
    })
    .catch(function(err) {
        // dispatch a failure and throw error
        throw err;
    });

Đặt .catchfor Promise.alltrước cái .thendường như đã phục vụ mục đích bắt bất kỳ lỗi nào từ các lời hứa ban đầu, nhưng sau đó trả lại toàn bộ mảng cho phần tiếp theo.then

Cảm ơn!

16 answers

211
jib 2015-05-22 05:27.

Promise.alllà tất cả hoặc không có gì. Nó giải quyết khi tất cả các lời hứa trong mảng được giải quyết hoặc từ chối ngay khi một trong số chúng từ chối. Nói cách khác, nó hoặc giải quyết với một mảng của tất cả các giá trị đã giải quyết hoặc từ chối với một lỗi duy nhất.

Một số thư viện có một cái gì đó được gọi Promise.when, mà tôi hiểu thay vì đợi tất cả các lời hứa trong mảng để giải quyết hoặc từ chối, nhưng tôi không quen thuộc với nó và nó không có trong ES6.

Ma cua ban

Tôi đồng ý với những người khác ở đây rằng bản sửa lỗi của bạn sẽ hoạt động. Nó sẽ giải quyết bằng một mảng có thể chứa hỗn hợp các giá trị thành công và các đối tượng lỗi. Thật bất thường khi chuyển các đối tượng lỗi trong đường dẫn thành công nhưng giả sử mã của bạn đang mong đợi chúng, tôi không thấy vấn đề gì với nó.

Lý do duy nhất tôi có thể nghĩ về lý do tại sao nó sẽ "không giải quyết" là nó bị lỗi trong mã mà bạn không hiển thị cho chúng tôi và lý do bạn không thấy bất kỳ thông báo lỗi nào về điều này là vì chuỗi hứa hẹn này không được kết thúc bằng một cuối cùng nắm bắt (theo như những gì bạn đang hiển thị cho chúng tôi).

Tôi đã có quyền tự do loại bỏ "chuỗi hiện có" khỏi ví dụ của bạn và kết thúc chuỗi bằng một cú đánh bắt. Điều này có thể không phù hợp với bạn, nhưng đối với những người đang đọc điều này, điều quan trọng là phải luôn trả lại hoặc chấm dứt chuỗi, nếu không các lỗi tiềm ẩn, thậm chí cả lỗi mã hóa, sẽ bị ẩn (đó là điều tôi nghi ngờ đã xảy ra ở đây):

Promise.all(state.routes.map(function(route) {
  return route.handler.promiseHandler().catch(function(err) {
    return err;
  });
}))
.then(function(arrayOfValuesOrErrors) {
  // handling of my array containing values and/or errors. 
})
.catch(function(err) {
  console.log(err.message); // some coding error in handling happened
});
170
Solominh 2017-09-04 04:46.

CÂU TRẢ LỜI MỚI

const results = await Promise.all(promises.map(p => p.catch(e => e)));
const validResults = results.filter(result => !(result instanceof Error));

API hứa hẹn trong tương lai

27
MosheZada 2019-12-22 03:13.

ES2020 giới thiệu phương thức mới cho kiểu Promise: Promise.allSettled()
Promise.allSettled cung cấp cho bạn tín hiệu khi tất cả các lời hứa đầu vào được giải quyết, có nghĩa là chúng được thực hiện hoặc bị từ chối. Điều này hữu ích trong trường hợp bạn không quan tâm đến trạng thái của lời hứa, bạn chỉ muốn biết khi nào công việc được hoàn thành, bất kể nó có thành công hay không.

const promises = [
  fetch('/api-call-1'),
  fetch('/api-call-2'),
  fetch('/api-call-3'),
];
// Imagine some of these requests fail, and some succeed.

const result = await Promise.allSettled(promises);
console.log(result.map(x=>x.status));
// ['fulfilled', 'fulfilled', 'rejected']

Đọc thêm trong bài đăng trên blog v8 https://v8.dev/features/promise-combinators

23
Benny Neugebauer 2017-01-07 04:28.

Để tiếp tục Promise.allvòng lặp (ngay cả khi Lời hứa từ chối), tôi đã viết một hàm tiện ích được gọi executeAllPromises. Hàm tiện ích này trả về một đối tượng có resultserrors.

Ý tưởng là tất cả Lời hứa mà bạn vượt qua executeAllPromisessẽ được bao bọc thành một Lời hứa mới sẽ luôn giải quyết. Lời hứa mới giải quyết bằng một mảng có 2 điểm. Vị trí đầu tiên giữ giá trị giải quyết (nếu có) và vị trí thứ hai giữ lỗi (nếu Lời hứa được bao bọc từ chối).

Bước cuối cùng, executeAllPromisestích lũy tất cả các giá trị của các lời hứa được bao bọc và trả về đối tượng cuối cùng với một mảng cho resultsvà một mảng cho errors.

Đây là mã:

function executeAllPromises(promises) {
  // Wrap all Promises in a Promise that will always "resolve"
  var resolvingPromises = promises.map(function(promise) {
    return new Promise(function(resolve) {
      var payload = new Array(2);
      promise.then(function(result) {
          payload[0] = result;
        })
        .catch(function(error) {
          payload[1] = error;
        })
        .then(function() {
          /* 
           * The wrapped Promise returns an array:
           * The first position in the array holds the result (if any)
           * The second position in the array holds the error (if any)
           */
          resolve(payload);
        });
    });
  });

  var errors = [];
  var results = [];

  // Execute all wrapped Promises
  return Promise.all(resolvingPromises)
    .then(function(items) {
      items.forEach(function(payload) {
        if (payload[1]) {
          errors.push(payload[1]);
        } else {
          results.push(payload[0]);
        }
      });

      return {
        errors: errors,
        results: results
      };
    });
}

var myPromises = [
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.reject(new Error('3')),
  Promise.resolve(4),
  Promise.reject(new Error('5'))
];

executeAllPromises(myPromises).then(function(items) {
  // Result
  var errors = items.errors.map(function(error) {
    return error.message
  }).join(',');
  var results = items.results.join(',');
  
  console.log(`Executed all ${myPromises.length} Promises:`);
  console.log(`— ${items.results.length} Promises were successful: ${results}`);
  console.log(`— ${items.errors.length} Promises failed: ${errors}`);
});

14
Herman 2019-02-15 11:08.

Như @jib đã nói,

Promise.all là tất cả hoặc không có gì.

Mặc dù vậy, bạn có thể kiểm soát một số lời hứa nhất định "được phép" thất bại và chúng tôi muốn tiếp tục .then.

Ví dụ.

  Promise.all([
    doMustAsyncTask1,
    doMustAsyncTask2,
    doOptionalAsyncTask
    .catch(err => {
      if( /* err non-critical */) {
        return
      }
      // if critical then fail
      throw err
    })
  ])
  .then(([ mustRes1, mustRes2, optionalRes ]) => {
    // proceed to work with results
  })
7
Nayan Patel 2019-03-18 21:54.

Đang chờ sử dụng Async -

ở đây một hàm không đồng bộ func1 đang trả về giá trị đã phân giải và func2 đang gặp lỗi và trả về giá trị null trong trường hợp này, chúng ta có thể xử lý theo cách chúng ta muốn và trả về tương ứng.

const callingFunction  = async () => {
    const manyPromises = await Promise.all([func1(), func2()]);
    console.log(manyPromises);
}


const func1 = async () => {
    return 'func1'
}

const func2 = async () => {
    try {
        let x;
        if (!x) throw "x value not present"
    } catch(err) {
       return null
    }
}

callingFunction();

Đầu ra là - ['func1', null]

6
Mohamed Mahmoud 2016-06-20 04:36.

Nếu bạn sử dụng thư viện q https://github.com/kriskowal/q, nó có phương thức q.allSettled () có thể giải quyết vấn đề này, bạn có thể xử lý mọi lời hứa tùy thuộc vào trạng thái của nó là đã đầy đủ hoặc bị từ chối.

existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
  return route.handler.promiseHandler();
});
return q.allSettled(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
//so here you have all your promises the fulfilled and the rejected ones
// you can check the state of each promise
arrayResolved.forEach(function(item){
   if(item.state === 'fulfilled'){ // 'rejected' for rejected promises
     //do somthing
   } else {
     // do something else
   }
})
// do stuff with my array of resolved promises, eventually ending with a res.send();
});
4
Tyler Yasaka 2018-09-18 12:32.

Đối với những người đang sử dụng ES8 gặp sự cố ở đây, bạn có thể làm như sau, sử dụng các hàm không đồng bộ :

var arrayOfPromises = state.routes.map(async function(route){
  try {
    return await route.handler.promiseHandler();
  } catch(e) {
    // Do something to handle the error.
    // Errored promises will return whatever you return here (undefined if you don't return anything).
  }
});

var resolvedPromises = await Promise.all(arrayOfPromises);
3
Nayan Patel 2018-09-04 04:47.

Chúng tôi có thể xử lý việc từ chối ở cấp độ hứa hẹn riêng lẻ, vì vậy khi chúng tôi nhận được kết quả trong mảng kết quả của mình, chỉ số mảng đã bị từ chối sẽ là undefined. Chúng tôi có thể xử lý tình huống đó khi cần thiết và sử dụng các kết quả còn lại.

Ở đây tôi đã từ chối lời hứa đầu tiên, vì vậy nó không được xác định, nhưng chúng ta có thể sử dụng kết quả của lời hứa thứ hai, ở chỉ mục 1.

const manyPromises = Promise.all([func1(), func2()]).then(result => {
    console.log(result[0]);  // undefined
    console.log(result[1]);  // func2
});

function func1() {
    return new Promise( (res, rej) => rej('func1')).catch(err => {
        console.log('error handled', err);
    });
}

function func2() {
    return new Promise( (res, rej) => setTimeout(() => res('func2'), 500) );
}

2
Tom Auger 2018-12-13 14:08.

Bạn đã xem xét Promise.prototype.finally()?

Nó dường như được thiết kế để làm chính xác những gì bạn muốn - thực hiện một chức năng khi tất cả các lời hứa đã giải quyết (giải quyết / bị từ chối), bất kể một số lời hứa bị từ chối.

Từ tài liệu MDN :

Các finally()phương pháp có thể hữu ích nếu bạn muốn làm một số chế biến hoặc dọn dẹp một lần lời hứa được giải quyết, bất kể kết quả của nó.

Các finally()phương pháp này rất giống với gọi .then(onFinally, onFinally)tuy nhiên có vài điểm khác biệt:

Khi tạo một hàm nội dòng, bạn có thể chuyển nó một lần, thay vì bị buộc phải khai báo nó hai lần hoặc tạo một biến cho nó.

Một lệnh gọi lại cuối cùng sẽ không nhận được bất kỳ đối số nào, vì không có phương tiện đáng tin cậy nào để xác định xem lời hứa đã được thực hiện hay bị từ chối. Trường hợp sử dụng này chính xác là khi bạn không quan tâm đến lý do từ chối hoặc giá trị thực hiện và vì vậy không cần cung cấp nó.

Không giống Promise.resolve(2).then(() => {}, () => {})(sẽ được giải quyết với không xác định), Promise.resolve(2).finally(() => {})sẽ được giải quyết với 2. Tương tự, không giống Promise.reject(3).then(() => {}, () => {})(sẽ được hoàn thành với không xác định), Promise.reject(3).finally(() => {})sẽ bị từ chối với 3.

== Dự phòng ==

Nếu phiên bản JavaScript của bạn không hỗ trợ, Promise.prototype.finally()bạn có thể sử dụng giải pháp thay thế này từ Jake Archibald :Promise.all(promises.map(p => p.catch(() => undefined)));

2
Kamil Kiełczewski 2020-06-29 23:00.

Promise.allSettled

Thay vì Promise.all, hãy sử dụng Promise.allSettled chờ tất cả các lời hứa giải quyết, bất kể kết quả như thế nào

let p1 = new Promise(resolve => resolve("result1"));
let p2 = new Promise( (resolve,reject) => reject('some troubles') );
let p3 = new Promise(resolve => resolve("result3"));

// It returns info about each promise status and value
Promise.allSettled([p1,p2,p3]).then(result=> console.log(result));

0
Eric 2019-05-01 11:44.

Ngoài ra, nếu bạn gặp trường hợp bạn không đặc biệt quan tâm đến giá trị của các lời hứa đã giải quyết khi có một lần thất bại nhưng bạn vẫn muốn chúng chạy, bạn có thể làm điều gì đó như thế này sẽ giải quyết các lời hứa như bình thường khi tất cả đều thành công và từ chối những lời hứa thất bại khi bất kỳ ai trong số họ thất bại:

function promiseNoReallyAll (promises) {
  return new Promise(
    async (resolve, reject) => {
      const failedPromises = []

      const successfulPromises = await Promise.all(
        promises.map(
          promise => promise.catch(error => {
            failedPromises.push(error)
          })
        )
      )

      if (failedPromises.length) {
        reject(failedPromises)
      } else {
        resolve(successfulPromises)
      }
    }
  )
}
0
Tamir Nakar 2019-07-15 21:37.

Bạn luôn có thể kết hợp các hàm trả về lời hứa của mình theo cách mà chúng bắt lỗi và trả về một giá trị đã thỏa thuận thay thế (ví dụ: lỗi. Thông báo), do đó, ngoại lệ sẽ không xuất hiện trên toàn bộ hàm Promise.all và vô hiệu hóa nó.

async function resetCache(ip) {

    try {

        const response = await axios.get(`http://${ip}/resetcache`);
        return response;

    }catch (e) {

        return {status: 'failure', reason: 'e.message'};
    }

}
0

Tôi đã tìm ra cách (giải pháp thay thế) để thực hiện việc này mà không cần đồng bộ hóa nó.

Vì vậy, như nó đã được đề cập trước đây Promise.alllà không có.

vì vậy ... Sử dụng một lời hứa kèm theo để nắm bắt và buộc giải quyết.


      let safePromises = originalPrmises.map((imageObject) => {
            return new Promise((resolve) => {
              // Do something error friendly
              promise.then(_res => resolve(res)).catch(_err => resolve(err))
            })
        })
    })

    // safe
    return Promise.all(safePromises)
0
Anthony Awuley 2019-11-19 14:54.

Bạn sẽ cần biết cách xác định lỗi trong kết quả của mình. Nếu bạn không gặp lỗi mong đợi chuẩn, tôi khuyên bạn nên chạy một phép chuyển đổi đối với từng lỗi trong khối bắt để nó có thể nhận dạng được trong kết quả của bạn.

try {
  let resArray = await Promise.all(
    state.routes.map(route => route.handler.promiseHandler().catch(e => e))
  );

  // in catch(e => e) you can transform your error to a type or object
  // that makes it easier for you to identify whats an error in resArray
  // e.g. if you expect your err objects to have e.type, you can filter
  // all errors in the array eg
  // let errResponse = resArray.filter(d => d && d.type === '<expected type>')
  // let notNullResponse = resArray.filter(d => d)

  } catch (err) {
    // code related errors
  }
0
Vincent Tang 2019-12-11 05:46.

Không phải là cách tốt nhất để ghi lỗi, nhưng bạn luôn có thể đặt mọi thứ thành một mảng cho promiseAll và lưu trữ kết quả thu được vào các biến mới.

Nếu bạn sử dụng graphQL, bạn cần phải xử lý sau phản hồi bất kể và nếu nó không tìm thấy tham chiếu chính xác, nó sẽ làm hỏng ứng dụng, thu hẹp vị trí của vấn đề

const results = await Promise.all([
  this.props.client.query({
    query: GET_SPECIAL_DATES,
  }),
  this.props.client.query({
    query: GET_SPECIAL_DATE_TYPES,
  }),
  this.props.client.query({
    query: GET_ORDER_DATES,
  }),
]).catch(e=>console.log(e,"error"));
const specialDates = results[0].data.specialDates;
const specialDateTypes = results[1].data.specialDateTypes;
const orderDates = results[2].data.orders;

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Tất nhiên Luật sư mới của Harvey Weinstein là một người phụ nữ chỉ trích tôi

Tất nhiên Luật sư mới của Harvey Weinstein là một người phụ nữ chỉ trích tôi

Phiên tòa xét xử vụ tấn công tình dục bị trì hoãn nhiều của Harvey Weinstein dự kiến ​​sẽ bắt đầu lựa chọn bồi thẩm đoàn vào tháng 9, và với dự đoán, ông đã sắp xếp lại đội ngũ pháp lý của mình lần thứ ba. Có lẽ không thể tránh khỏi, các luật sư của anh ấy hiện bao gồm luật sư bào chữa Donna Rotunno, người nổi tiếng với việc đại diện cho những người đàn ông bị cáo buộc tấn công tình dục, đặt câu hỏi về phong trào MeToo nói chung và đã nói trong các cuộc phỏng vấn trước đây rằng giới tính của cô ấy cho phép cô ấy thoát khỏi "nọc độc" nhiều hơn khi kiểm tra chéo người tố cáo.

Cựu trợ lý của Harvey Weinstein nói rằng ông là 'kẻ thao túng bậc thầy'

Cựu trợ lý của Harvey Weinstein nói rằng ông là 'kẻ thao túng bậc thầy'

Trong một cuộc phỏng vấn với BBC News, trợ lý cũ của Harvey Weinstein, Zelda Perkins, nói rõ thực tế của việc chống lại ông trùm Hollywood. Cô ấy nói, về cơ bản là không thể.

Không có người chơi nào trên bầu trời của họ có cuộc chiến đầu tiên của họ và nó đã giết chết hoàn toàn một nền văn minh

Không có người chơi nào trên bầu trời của họ có cuộc chiến đầu tiên của họ và nó đã giết chết hoàn toàn một nền văn minh

Nguồn ảnh: AndyKrycek6 Những người hâm mộ No Man's Sky không thể chơi với nhau một cách chính xác, nhưng họ vẫn thích đến với nhau để ăn mừng cộng đồng của họ. Bằng cách nào đó, một kỳ nghỉ mới do người chơi tạo ra đã trở thành một câu chuyện về xung đột, phản bội và sự biến mất của cả một nền văn minh.

Cựu Giám đốc Thanh niên Bắc Carolina NAACP buộc tội Giám sát viên về hành vi quấy rối tình dục và cưỡng bức như thế nào Quốc gia xử lý yêu cầu của cô ấy

Cựu Giám đốc Thanh niên Bắc Carolina NAACP buộc tội Giám sát viên về hành vi quấy rối tình dục và cưỡng bức như thế nào Quốc gia xử lý yêu cầu của cô ấy

Jazmyne Childs đã khóc trong một cuộc họp báo vào ngày 25 tháng 9 năm 2019, khi cô ấy mô tả về hành vi quấy rối tình dục mà cô ấy nói rằng cô ấy đã phải chịu đựng khi làm việc cho phân hội Bắc Carolina của NAACP, ở Raleigh, N.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Tôi viết như thế nào

Tôi viết như thế nào

Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Language